swift - 当应用程序在 iOS 11.4.1 中处于后台时,静默通知不起作用
问题描述
我正在尝试开发一个信使应用程序,当应用程序处于前台或后台时,客户端只需要发送静默通知。
它在 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-11.2.x 存在静默推送交付几乎“永远”延迟的问题,但这些问题已得到解决。
机会交付
机会主义交付尝试等待“最佳”时间来唤醒应用程序以进行后台工作。例如,当设备插入电源并连接到 WiFi 时,后台工作很可能会执行 - 理想条件。在不太理想的条件下,iOS 会猜测何时是唤醒应用程序的好时机。
Apple 在 WWDC 2013 会议中很好地解释了这一点What's New In Multitasking
限速后台执行
后台唤醒限制器试图阻止应用程序滥用后台执行。许多应用程序希望在后台做很多工作,或者安排后台工作,以便应用程序几乎一直在后台运行。速率限制器试图阻止应用程序滥用后台执行。Apple 没有记录这种行为,但它(可能)看起来像这样:
速率限制器以延迟值开始,比如 10 分钟。因此,在收到静默推送 10 分钟后,它将被传送到设备。
每次在后台启动您的应用程序以执行工作时,速率限制器都会使延迟加倍。
每次您的应用程序花费超过 15 秒的时间来调用传递的块以
application(_:didReceiveRemoteNotification:fetchCompletionHandler:)
再次使延迟加倍。超过30秒,翻两番。每次用户打开您的应用程序时,延迟都会重置回原始值。
其他因素,如记忆力和能源消耗也可能发挥作用,但这应该让您对可能发生的事情有一个很好的了解。Apple 提供了日志配置文件,可以让您查看何时收到推送、何时将其传送到您的应用程序以及您的应用程序何时实际启动以执行后台工作。越狱设备可能允许您即时修改延迟值以进行故障排除。
推荐阅读
- php - 从具有行跨度的数组/数组多维生成动态表
- unity3d - 无法在 Unity 中将 Applovin 与 Admob 中介集成
- java - Spring MVC 通过表单更新对象
- json - 在 Racket 中转换 yaml -> json
- asp.net-core - 无法在使用 Visual Studio 2019 的项目中使用 Bootstrap
- php - 使用 OOP 返回类加载方法
- git - git合并的奇怪之处?
- javascript - addClass 函数正常工作,但 removeClass 函数在表单的输入文本字段上不起作用?
- lua - Lua ESP8266 脚本期待额外 =
- r - 按条件删除行