因此,我在我的应用程序中实现了远程推送通知(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 ,本质上是:
- 将基于委托(delegate)的 URLSession 与后台 URLSessionConfiguration 结合使用。
- 仅使用上传和下载任务,不使用完成处理程序。
- 在应用委托(delegate)中实现
application(_:handleEventsForBackgroundURLSession:completionHandler:)
,保存完成处理程序并启动后台 session 。 - 在 URLSessionDelegate 中实现
urlSessionDidFinishEvents(forBackgroundURLSession:)
,调用已保存的完成处理程序,让操作系统知道您已完成处理后台请求完成。
此外,请注意后台上传任务只能处理文件。如果您尝试从内存中上传数据对象形式的字节数组,它们将立即失败。
关于ios - Swift/iOS - 回复通知失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56088122/