代码之家  ›  专栏  ›  技术社区  ›  AlexWoe89

iOS11 swift静默推送(后台抓取、DidReceiveMemoteNotification)不再工作

  •  10
  • AlexWoe89  · 技术社区  · 7 年前

    我希望iOS11的发布能够解决最新betas和GM版本的iOS中的无声推送问题。

    目前,我正在努力理解为什么我没有收到任何无声推送消息,这实际上应该唤醒我的应用程序,在后台执行一些必要的任务。

    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 回复  |  直到 6 年前
        1
  •  5
  •   AlexWoe89    7 年前

    最终更新2017-10-31

    苹果刚刚在万圣节发布了iOS 11.1

    Apple Release Software Update 31st of October

    更新2017-10-09

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

    静默推送通知的处理频率更高。(33278611)

    更新-测试 -&燃气轮机;在使用不同场景进行了一些测试后,这个错误似乎在最新的iOS11.1 beta 2版本中得到了修复。现在我们只能等待官方发布。在一些论坛上,他们认为苹果将在10月底发布iOS11.1。


    旧职位

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

    我将空函数添加到 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中未调用。

    在我的例子中,“静默推送”现在在前台和后台模式下都能工作,但如果应用程序从用户或操作系统中挂起,则不能工作。因此,这个问题仍然是开放的,没有固定的-任何帮助感谢! 有关更多信息,请参阅此线程: Silent pushes not delivered to the app on iOS 11


    更新2017-10-05

    通知解决了问题
    静默推送通知的处理频率更高。(33278611)

    一些开发者说这个问题已经通过这个测试版解决了,其他开发者说这个问题在某些情况下仍然存在。现在,当苹果为客户推出iOS11.1时,这将是一件有趣的事。

        2
  •  0
  •   Yunlong Wang    6 年前

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

    here .