Это было определенно ошибка на стороне яблок. Они что-то сломали в операционной системе ios11. В прошлом году было несколько дискуссий об этом времени, и приложения не получали push-уведомлений в течение почти 1 месяца. Кстати, на этот вопрос ответили год назад, вы не можете ссылаться на текущую документацию

еялся, что в выпуске iOS11 будет исправлена ​​проблема «тихого пуша», которая была в последних бета-версиях и GM-версии iOS.

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

В iOS 10 я просто использовал возможность фоновой выборки и реализовал «код пробуждения» в моем AppDelegate, как показано ниже.

В iOS 11 код регистрации по-прежнему работает нормально, и мой бэкэнд также доставляет push-уведомления серверам Apples DEV (песочница), а также серверам PROD (рабочий выпуск). К сожалению функция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

ОБНОВЛЕНИЕ 2017-10-09

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

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

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

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

ОБНОВЛЕНИЕ - Тестирование -> После некоторого тестирования с различными сценариями эта ошибка, кажется, исправлена ​​в последней версии iOS11.1 beta 2. Теперь нам остается только ждать официального релиза. На некоторых форумах предполагают, что Apple выпустит 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.

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

ОБНОВЛЕНИЕ 2017-09-25

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

ОБНОВЛЕНИЕ 2017-10-05

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

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

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

 AlexWoe8924 сент. 2017 г., 19:05
Я только что попробовал -> если установлен флажок «Ожидание запуска исполняемого файла», приложение не будет активировано, также, если я объединю опцию с флажком «Запуск из-за события фоновой выборки». В моем случае это работает, только если вы отметили «Запуск из-за события фоновой выборки» и запуск «Автоматически».
 Jan24 сент. 2017 г., 18:38
«После прочтения заметок о выпуске Apple», где Apple упомянула что-то об этом?
 Jan24 сент. 2017 г., 19:09
да, это то же самое поведение, которое я имею в своем вопросе SO, и это то, что отличается от iOS 10, где приложение было возвращено из приостановленного в фоновый режим и вызван метод делегата.
 AlexWoe8924 сент. 2017 г., 18:39
Они ничего не упоминали, но я много пытался и понял, что это решение работает.
 Jan24 сент. 2017 г., 18:52
Хорошо. Это работает для вас, когда вы запускаете приложение в режиме ожидания? (Схема -> установите флажок «Дождаться запуска исполняемого файла», а затем отправьте push. В моем случае я все еще теряю тихие нажатия, когда приложение находится в этом состоянии. См. Мое «ОБНОВЛЕНИЕ 13.09 - iOS 11 GM» здесьstackoverflow.com/questions/44796613/...

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

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

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

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

 AlexWoe8919 июл. 2018 г., 11:55
Это было определенно ошибка на стороне яблок. Они что-то сломали в операционной системе ios11. В прошлом году было несколько дискуссий об этом времени, и приложения не получали push-уведомлений в течение почти 1 месяца. Кстати, на этот вопрос ответили год назад, вы не можете ссылаться на текущую документацию

Ваш ответ на вопрос