ios - Swift/iOS - 回复通知失败

标签 ios swift iphone push-notification apple-push-notifications

因此,我在我的应用程序中实现了远程推送通知(apn),以便我可以从服务器向客户端发送通知。

我的应用程序是一种类似于 Whatsapp 或 Telegram 的信使,因此我希望客户端能够回复通知。因此,我实现了 NotificationService 扩展。

如果我按下通知,将我的消息输入到出现的文本字段中,然后单击应答按钮(就像我们都从我们最喜欢的消息应用程序中知道的那样)我希望将消息发送到后台到我的服务器。

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
   // on reply
   if let url = URL(string: "myserver/send/text") {
       let task = URLSession.shared.dataTask(with: url) {(data, response, error) in
         if let serverResult = data as? String {
           print("success")
         }
       }
       task.resume() 
   }
}

此方法有时有效,但我注意到如果应用程序关闭或我的 iPhone 被锁定,我会遇到一些问题:使用此代码无法获取 URL。

通过调试器,我在日志中发现了一些非常有趣的内容:软件导致连接中止

如何解决这个问题?如果我实现套接字,它会改变什么吗?为什么这对 telegram/whatsapp 等客户有效,但对我不起作用?我到底做错了什么? :-(

最佳答案

如果您希望在应用程序不再处于前台后继续进行下载/上传,则需要使用后台 session 数据任务。 URL session 编程指南中概述了后台 session 的基本约束:Using NSURLSession: Background Transfer Considerations ,本质上是:

  1. 将基于委托(delegate)的 URLSession 与后台 URLSessionConfiguration 结合使用。
  2. 仅使用上传和下载任务,不使用完成处理程序。
  3. 在应用委托(delegate)中实现 application(_:handleEventsForBackgroundURLSession:completionHandler:),保存完成处理程序并启动后台 session 。
  4. 在 URLSessionDelegate 中实现 urlSessionDidFinishEvents(forBackgroundURLSession:),调用已保存的完成处理程序,让操作系统知道您已完成处理后台请求完成。

此外,请注意后台上传任务只能处理文件。如果您尝试从内存中上传数据对象形式的字节数组,它们将立即失败。

关于ios - Swift/iOS - 回复通知失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56088122/

相关文章:

ios - Apple 是否使用黑魔法来完成相机的预览方向?

iOS - 为什么我不能以相同的方式使用 pushViewController 两次?

ios - AVAudioPlayer 实例的音量控制

ios - 长时间运行的异步任务 - 如何在用户可能导航到的任何 View Controller 中接收回调

iphone - 如何在 iPhone 横向模式下删除 UITableview 滚动中的空白?

ios - iPhone 5 分辨率错误

ios - Swift 中从 UIView 切换到 ScrollView

ios - Swift 缓冲区指针和数组索引

ios - 验证 UITextField 中的电子邮件地址

iphone - 有没有办法从应用程序的 .ipa 存档中查看应用程序的 .entitlements 文件?