iOS11 swift静态推送(后台提取,didReceiveRemoteNotification)不再工作

时间:2017-09-20 19:12:46

标签: swift ios10 ios11 background-fetch silentpush

我希望iOS11版本能够修复无声推送问题,这是最新的测试版和通用版iOS版本。

目前我很难理解,为什么我没有收到任何无声推送消息,这实际上应该唤醒我的应用以在后台执行一些所需的任务。

在iOS 10中,我只使用后台获取功能并实现了“唤醒代码”。在我的AppDelegate中,如下面的代码。

在iOS 11中,注册代码仍然正常工作,我的后端也向Apples DEV服务器(沙箱)和PROD服务器(生产版本)提供推送通知。不幸的是,静态推送通知永远不会调用函数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 ....
       }
   }
}

2 个答案:

答案 0 :(得分:5)

最终更新2017-10-31

Apple刚刚发布了iOS 11.1的正式版(万圣节)

Apple Release Software Update 31st of October

更新2017-10-09

Apple今天发布了iOS11.1 beta 2。他们再次在发行说明中提到了以下注释:

  

通知已解决的问题

     

更频繁地处理无声推送通知。 (33278611)

我将再次测试此测试版2并更新此答案以供您参考。

更新 - 测试 - >在针对不同场景进行一些测试之后,这个错误似乎在最新的iOS11.1 beta 2版本中得到修复。现在我们只能等待正式发布。在一些论坛中,他们认为Apple将在10月底发布iOS11.1。

较旧的帖子

我上周调查了很多时间来寻找关于这个问题的答案。在阅读了苹果发行说明(包括已弃用,已更改和新功能)后,我测试了以下情况:

我将空函数添加到我的AppDelegate ,现在静音推送在前景和后台再次工作

func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        logger.log.debug("Perform Fetch with completion handler TEST")
    }

我不确定这个'解决方法'与此问题有关,在iOS11中未调用以下function application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void)

然而,如果你发现同样的行为,你可以试一试并给我反馈。

更新2017-09-25

'沉默推动'现在在我的情况下在前台和后台模式下工作,但不是,如果应用程序是从用户或操作系统暂停的。所以这个问题仍然是开放的,没有修复 - 任何帮助表示赞赏! 有关更多信息,请参阅此主题: Silent pushes not delivered to the app on iOS 11

更新2017-10-05

苹果公司几天前发布了iOS11.1测试版。他们在发行说明中提到了以下内容:

  

通知已解决的问题
  更频繁地处理静默推送通知。 (33278611)

一些开发人员说该问题已通过此测试版得到解决,其他开发人员表示该问题在某些情况下仍然存在。现在,当Apple为客户推出iOS11.1时会很有趣。

答案 1 :(得分:0)

您遇到的实际上是有据可查的行为,而不是错误。

Apple's documentation说: “系统将静默通知视为低优先级。您可以使用它们来刷新应用程序的内容,但系统不能保证其交付。此外,如果总数过多,静默通知的发送可能会受到限制。系统允许的静默通知的实际数量取决于当前条件,但每小时请勿尝试发送两个或三个以上的静默通知。”

总而言之,不能保证无提示通知会唤醒您的应用程序。为什么?用户设备后台的应用程序被唤醒的次数越多,电池消耗就越高。

根据IBM的声明,它说:“随着iOS 11的问世,苹果已经对处理某些类型的推送消息的方式进行了更改。这样做是为了延长电池寿命,但要付出用户体验的代价,可能会影响您的应用。”您可以找到更多详细信息here