我希望iOS11版本能够解决无提示推送问题,该问题已在最新的Beta和GM版本的iOS中出现。
目前,我一直在努力理解为什么我没有收到任何静默的推送消息,这实际上应该唤醒我的应用程序以在后台执行一些所需的任务。
在iOS 10中,我仅使用后台获取功能,并在AppDelegate中实现了“唤醒代码”,如以下代码所示。
在iOS 11中,注册代码仍然可以正常工作,我的后端还向Apple DEV服务器(沙盒)和PROD服务器(生产版本)传递了推送通知。不幸的是,该功能func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void)从未被静默推送通知调用。
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void)
我真的在这里错过了iOS 11的东西吗?
@UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { // .. some variables here ... func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // register silent push notification in backend application.registerForRemoteNotifications() // ... some code here ... // Set Background Fetch Intervall for background services / terminated app UIApplication.shared.setMinimumBackgroundFetchInterval(UIApplicationBackgroundFetchIntervalMinimum) // ... some code here ... return true } func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { let tokenParts = deviceToken.map { data -> String in return String(format: "%02.2hhx", data) } let token = tokenParts.joined() logger.log.debug("Device Token: \(token)") let realm = RealmController() let user = realm.getLoggedInUserObject() // Send push token to server if let user = user { let email = user.email! let serverController = ServerController.serverController serverController.sendPushToken(token: token, email: email) { status in if status == 201 { // ... some code here ... } else { // ... some code here ... } } } } func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) { logger.log.debug(error) } func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { logger.log.debug(userInfo) let aps = userInfo["aps"] as! [String: AnyObject] if aps["content-available"] as? Int == 1 { // .... some silent push tasks here .... } } }
最终更新2017-10-31
苹果刚刚发布了iOS 11.1的正式(万圣节)版本
更新2017-10-09
苹果今天发布了iOS11.1 beta 2。他们再次在发行说明中提到以下说明:
通知已解决的问题 静默推送通知的处理频率更高。(33278611)
通知已解决的问题
静默推送通知的处理频率更高。(33278611)
我将再次测试此Beta 2版本,并更新此答案供您参考。
更新-测试 ->经过不同场景的测试后,此错误似乎已在最新的iOS11.1 beta 2版本中修复。现在我们只能等待正式发布。在某些论坛中,他们认为Apple将于10月下旬发布iOS11.1。
旧帖子
上周,我调查了大量时间以寻找有关此问题的答案。阅读苹果发行说明(包括不推荐使用,更改和新功能)后,我测试了以下情况:
我向我添加了empty函数AppDelegate ,现在无声推送在前台和后台再次起作用 :
AppDelegate
func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { logger.log.debug("Perform Fetch with completion handler TEST") }
我不确定此“解决方法”是否与问题相关function application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void),iOS11中未调用以下内容。
function application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void)
不过,如果您发现相同的行为,可以尝试一下并给我反馈。
更新2017-09-25
在我的情况下,“无声推送”现在在前景和后台模式下有效,但如果该应用已从用户或操作系统挂起,则该功能无效。因此,此问题仍然悬而未决- 感谢您提供任何帮助
更新2017-10-05
苹果几天前发布了iOS11.1 beta。他们在发行说明中提到了以下内容:
已解决的通知问题 静默推送通知的处理频率更高。(33278611)
一些开发人员说此版本已解决了该问题,其他开发人员则说在某些情况下该问题仍然存在。现在,当苹果公司为客户推出iOS11.1时会很有趣。