didReceiveRemoteNotification, когда приложение в фоновом режиме работает только при подключении устройства к MacBook

#ios #swift #xcode #push-notification #appdelegate

#iOS #swift #xcode #push-уведомление #appdelegate

Вопрос:

Я тестирую background app refresh свое устройство, подключенное к моему компьютеру. Код выполняется нормально и в didReceiveRemoteNotification , функция завершена до вызова обработчика завершения:

 completionHandler(UIBackgroundFetchResult.newData)
 

Однако, когда я отключаю свое устройство от компьютера и пытаюсь выполнить то же самое, фоновое обновление приложения не работает, и код в didReceiveRemoteNotification не запускается, пока приложение не выйдет на передний план.

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

Я убедился, settings -> general -> background app refresh что оно включено глобально и для моего приложения.

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

 func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

    if userInfo["message_id"] as? String != nil {
        MessageHelper().saveServerMessageToLocalDatabase(self.privateContext, serverMessage: userInfo as! [String : AnyObject] completion: { (message: Message?) in
            if message != nil {
                do {
                    try self.privateContext.save()
                    completionHandler(UIBackgroundFetchResult.newData)
                } catch {
                    print("error saving context")
                    completionHandler(UIBackgroundFetchResult.newData)
                }
            } else {
                completionHandler(UIBackgroundFetchResult.newData)
            }
        })
    } else {
        completionHandler(UIBackgroundFetchResult.newData)
    }
}
 

Комментарии:

1. didReceiveRemoteNotification вызывается, когда пользователь открывает приложение с помощью уведомления.

2. Из документации — если вы включили фоновый режим удаленных уведомлений, система запускает ваше приложение (или выводит его из приостановленного состояния) и переводит его в фоновое состояние при поступлении удаленного уведомления. Однако система не запускает ваше приложение автоматически, если пользователь принудительно завершает его. В этой ситуации пользователь должен перезапустить ваше приложение или перезагрузить устройство, прежде чем система снова попытается автоматически запустить ваше приложение.

3. Поэтому, если ваше приложение находится в фоновом или приостановленном состоянии, оно разбудит ваше приложение. Но если приложение «не запущено», оно не разбудит ваше приложение

4. Вам необходимо реализовать PushKit, чтобы выполнить ваши требования для отключения всех состояний, фонового или приостановленного или т. Д.

5. приложение не завершено, оно находится в фоновом режиме. Функция должна быть вызвана и завершена. у него есть 30 секунд. однако он функционирует должным образом только при подключении к компьютеру и переводе в фоновый режим. не при использовании и в фоновом режиме.

Ответ №1:

Если вы используете автоматические уведомления,

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

введите описание изображения здесь

Пожалуйста, ознакомьтесь с полным документом здесь: автоматическое обновление вашего приложения

Все это не применимо, когда устройство подключено к вашему Mac. Приложение будет получать все уведомления при подключении.

Кроме того, убедитесь, что обратный вызов не переходит к следующему методу.

 func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void)
 

Надеюсь, это поможет.

Комментарии:

1. Я не использую автоматические уведомления и не упоминал об этом вообще

2. хорошо .. Вы тестируете didReceiveRemoteNotification с помощью громкого уведомления и, случайно, у вас есть этот метод в вашем коде: » func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, с завершением обработчика завершенийHandler: @escaping () -> Void)»

3. @alionthego, есть какие-либо обновления по этому поводу? Смогли ли вы решить свою проблему?