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

Posted

技术标签:

【中文标题】当应用程序在 iOS 11.4.1 中处于后台时,静默通知不起作用【英文标题】:Silent notification is not working when app in background in iOS 11.4.1 【发布时间】:2018-08-03 10:58:16 【问题描述】:

我正在尝试开发一个信使应用程序,当应用程序处于前台或后台时,客户端只需要发送静默通知。

它在 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,但找不到解决方案。

【问题讨论】:

似乎在 iOS 11.1 中解决了静默通知问题,并且您正在使用它应该工作的 11.4。确保您使用application:didReceiveRemoteNotification:fetchCompletionHandler 作为接收器方法。 请检查我更新的问题。上述方法是否有任何改变? 我在 iOS 13 上的设置几乎相同,并且实际传递到我的应用程序的静默推送量受到限制,而不是在某一时刻受到限制。当我取消订阅并重新订阅时,我可以成功获得一个。还有一次,我确实在不到 20 秒的时间内收到了大约 4 个。 【参考方案1】:

无声推送有两件事情对它们不利:机会性交付和后台唤醒限制器。这两件事共同使它看起来像无声推送实际上可能不起作用。 iOS 11-11.2.x 存在静默推送交付延迟几乎“永远”的问题,但这些问题已得到解决。

投机取巧

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

Apple 在 WWDC 2013 会议中很好地解释了这一点 What's New In Multitasking

限制后台执行的速率

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

速率限制器以延迟值开始,例如 10 分钟。因此,在收到静默推送 10 分钟后,它会传送到设备。

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

每次您的应用程序调用传递给application(_:didReceiveRemoteNotification:fetchCompletionHandler:) 的块的时间超过 15 秒时,延迟再次加倍。超过 30 秒,翻两番。

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

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

【讨论】:

以上是关于当应用程序在 iOS 11.4.1 中处于后台时,静默通知不起作用的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序处于后台时,在 iOS appDelegate didReceiveRemoteNotification 中调用 lambda 函数

应用程序在 iOS 11 中处于后台时未收到推送通知

当应用程序处于后台时,iOS 处理通知和有效负载

当应用程序在iOS swift 3中处于后台模式时如何每10秒获取一次纬度和经度

Flutter:当应用程序处于后台但未在 iOS 中终止时,无法在通知单击时重定向到特定屏幕

iOS 8 Beta 6 - 当应用程序处于后台时处理 UILocalNotification