iOS11 swift silent push (фоновая выборка, didReceiveRemoteNotification) больше не работает

Я надеялся, что выпуск iOS11 исправит проблему silent push, которая была в последней версии betas и GM iOS.

В настоящее время я изо всех сил пытаюсь понять, почему я не получаю никаких тихих push-сообщений, которые должны фактически разбудить мое приложение для выполнения некоторых необходимых задач в фоновом режиме.

в iOS 10 я просто использую возможность извлечения фона и реализовал "код пробуждения" в моем AppDelegate, как код ниже.

в iOS 11 Регистрация кода по-прежнему работает нормально, и мой бэкэнд также доставляет push-уведомление на серверы Apple DEV (sandbox), а также на серверы PROD (production release). К сожалению, функция func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) никогда не вызывается тихими push-уведомлениями.

Я действительно пропустил что-то здесь для 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 ответов


окончательное обновление 2017-10-31

Apple только что выпустила официальный (Хэллоуин) выпуск iOS 11.1

Apple Release Software Update 31st of October

обновление 2017-10-09

Apple выпустила iOS11.1 бета 2 сегодня. Опять же, они упомянули в своих примечаниях к выпуску следующее примечание:

Уведомления Решены Вопросы

тихие уведомления толчка обрабатываются чаще. (33278611)

Я собираюсь снова протестировать эту бета-версию 2 и обновить этот ответ для вашей информации.

обновление - тестирования - > после некоторого тестирования с различными сценариями эта ошибка, похоже, исправлена в последнем iOS11.1 бета-версия 2. Теперь остается только ждать официального релиза. На некоторых форумах они предполагают, что Apple выпустит iOS11.1 в конце октября.


старый пост

I исследовал много времени на прошлой неделе, чтобы найти ответ по этому вопросу. После прочтения заметок о выпуске apple (ВКЛ. устаревшие, измененные и новые функции) я протестировал следующую ситуацию:

я добавил пустую функцию в my 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.

тем не менее вы можете дать ему попробовать и дать мне обратную связь, если вы определите то же поведение.

обновление 2017-09-25

"тихий толчок" теперь работает в моем случае в режиме переднего плана и фона, но нет, если приложение приостановлено либо от пользователя, либо от ОС. Таким образом, эта проблема по - прежнему открыта и не исправлена-любая помощь оценена! Для получения дополнительной информации см. Также этот поток: бесшумные толчки не доставлены в приложение на iOS 11


обновление 2017-10-05

Apple выпустила iOS11.1 бета несколько дней назад. Они упомянули в своих примечаниях к выпуску следующее:

Уведомления Решены Вопросы
Тихие push-уведомления обрабатываются чаще. (33278611)

некоторые разработчики говорят, что проблема исправлена с этой бета-версией, другие разработчики говорят, что проблема все еще присутствует в некоторые обстоятельства. Теперь было бы интересно, когда Apple запускает iOS11.1 для клиентов.


то, что вы испытываете на самом деле хорошо документированное поведение, а не баг.

документация Apple говорит: "Система рассматривает тихие уведомления как низкоприоритетные. Вы можете использовать их для обновления содержимого вашего приложения, но система не гарантирует их доставку. Кроме того, доставка беззвучных уведомлений может регулироваться, если общее число становится чрезмерным. Фактическое количество тихих уведомлений, разрешенных системой, зависит от текущего условия, но не пытайтесь отправлять более двух-трех тихих уведомлений в час."

таким образом, тихое уведомление не гарантирует пробуждения вашего приложения. Почему? Чем чаще приложение в фоновом режиме на устройстве пользователя просыпается, тем выше потребление батареи.

согласно заявлению IBM, в нем говорится: "с появлением iOS 11 Apple внесла изменения в то, как они обрабатывают определенные виды push-сообщений. Это было сделано для улучшения батареи жизнь, но приходит за счет пользовательского опыта, который, вероятно, повлияет на ваше приложение."Вы можете найти более подробную информацию здесь.