【问题标题】:Swift/iOS - reply on notification failsSwift/iOS - 通知回复失败
【发布时间】:2019-09-28 23:37:10
【问题描述】:

所以我在我的应用程序中实现了远程推送通知 (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 这样的客户有效,但对我无效?我到底做错了什么? :-(

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-11
      • 2015-02-13
      • 2013-09-02
      • 1970-01-01
      • 2016-05-14
      • 1970-01-01
      • 2017-06-04
      相关资源
      最近更新 更多