当iOS 11.4.1中的应用程序在后台运行时,静默通知不起作用

时间:2018-08-03 10:58:16

标签: swift firebase apple-push-notifications firebase-cloud-messaging ios11.4

我正在尝试开发Messenger应用,当应用处于前台或后台时,客户端只需要发送静默通知即可。

它在IOS 10.2.1 Verizon iPhone中完美运行。

更新为11.4.1后,通知仅在前台起作用,而在后台则不起作用。

有效载荷:

 {
     "to" : "/topics/channel_18",
     "data" : {
      "action" : "NOTIFY",
      "message" : "{"text":"test" }"
     },
     "content_available" : true
    }

代码:

 func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                     fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

         Messaging.messaging().appDidReceiveMessage(userInfo)
        let action = userInfo["action"] as! String        

        // Configure the notification's payload.
        let content = UNMutableNotificationContent()
        content.title = NSString.localizedUserNotificationString(forKey: "Hello!", arguments: nil)
        content.body = NSString.localizedUserNotificationString(forKey: "testing", arguments: nil)
        content.sound = .none

        // Deliver the notification in five seconds.
        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 1, repeats: false)
        let request = UNNotificationRequest(identifier: "FiveSecond", content: content, trigger: trigger) // Schedule the notification.
        let center = UNUserNotificationCenter.current()
        center.add(request) { (error : Error?) in
            if let theError = error {

            }
        }


        completionHandler(UIBackgroundFetchResult.newData)
    }

我已经通过链接Silent pushes not delivered to the app on iOS 11,但找不到解决方法。

1 个答案:

答案 0 :(得分:0)

无声推送有两点不利于他们:机会传递和后台唤醒限制器。这两件事合起来使看起来静默推送实际上可能不起作用。 iOS 11-11.2.x遇到的问题是,静默推送交付“几乎”永远“延迟”了,但是已经解决了。

机会传递

机会传递尝试等待“最佳”时间来唤醒应用程序进行后台工作。例如,当设备接通电源并连接到WiFi时-理想情况下,很有可能会执行后台工作。在不太理想的条件下,iOS会猜测何时将是唤醒应用程序的好时机。

Apple在WWDC 2013会议What's New In Multitasking

中对此进行了很好的解释

速率限制后台执行

后台唤醒限制器尝试阻止应用滥用后台执行。许多应用程序都希望在后台执行大量工作,或者安排后台工作,以便该应用程序几乎始终在后台运行。速率限制器尝试阻止应用滥用后台执行。 Apple没有记录这种行为,但是(可能)看起来像这样:

  • 速率限制器从一个延迟值开始,比如说10分钟。因此,在收到无声推送10分钟后,它就会传递到设备中。

  • 每次在后台启动您的应用程序以执行工作时,速率限制器都会使延迟加倍。

  • 您的应用每次调用传递到application(_:didReceiveRemoteNotification:fetchCompletionHandler:)的代码块都需要15秒钟以上,因此延迟再次加倍。超过30秒,将其增加三倍。

  • 每次用户打开您的应用时,延迟都会重置为原始值。

诸如内存和能源消耗之类的其他因素也可能起作用,但这应该使您对可能发生的事情有了一个很好的了解。 Apple提供的日志记录配置文件可让您查看何时接收到推送,何时将推送传递到您的应用程序以及实际启动应用程序进行后台工作的时间。越狱的设备可能允许您即时修改延迟值以进行故障排除。