因此,我对应用程序实施了远程推送通知 (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之类的客户有效,但对我却无效?我到底在做什么错? :-(
答案 0 :(得分:0)
如果要在应用程序不再处于前台之后继续进行下载/上传,则需要使用后台会话数据任务。 《 URL会话编程指南:Using NSURLSession: Background Transfer Considerations》概述了后台会话的基本限制,并且基本上是:
application(_:handleEventsForBackgroundURLSession:completionHandler:)
,保存完成处理程序并启动后台会话。urlSessionDidFinishEvents(forBackgroundURLSession:)
,调用保存的完成处理程序以使OS知道您已完成后台请求完成的处理。此外,请注意以下事实:后台上传任务仅可以处理文件。如果您尝试从内存中上传Data对象形式的字节数组,它们将立即失败。