Swift / iOS-通知回复失败

时间:2019-05-11 07:21:34

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

因此,我对应用程序实施了远程推送通知 (apn),以便可以将通知从服务器发送到客户端。

我的应用程序就像whatsapp或电报一样,是一个使者,因此我希望客户端能够响应通知。因此,我实现了 NotificationService 扩展。

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

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。

使用调试器,我在日志中发现了一些非常有趣的东西:软件导致连接中断

如何解决此问题?如果实现套接字,它会改变某些东西吗?为什么这对电报/ whatsapp之类的客户有效,但对我却无效?我到底在做什么错? :-(

1 个答案:

答案 0 :(得分:0)

如果要在应用程序不再处于前台之后继续进行下载/上传,则需要使用后台会话数据任务。 《 URL会话编程指南:Using NSURLSession: Background Transfer Considerations》概述了后台会话的基本限制,并且基本上是:

  1. 将基于委托的URLSession与后台URLSessionConfiguration一起使用。
  2. 仅使用上传和下载任务,没有完成处理程序。
  3. 在应用程序委托中实施application(_:handleEventsForBackgroundURLSession:completionHandler:),保存完成处理程序并启动后台会话。
  4. 在URLSessionDelegate中实施urlSessionDidFinishEvents(forBackgroundURLSession:),调用保存的完成处理程序以使OS知道您已完成后台请求完成的处理。

此外,请注意以下事实:后台上传任务仅可以处理文件。如果您尝试从内存中上传Data对象形式的字节数组,它们将立即失败。