Я знаю, что это во многих местах, но я не могу понять это. Я использую Urban Airship для push-уведомлений. Все кажется прекрасным, за исключением того, что когда мое приложение находится в фоновом режиме - didReceiveRemoteNotification
не получает вызов. Он работает, когда на переднем плане - я могу правильно обрабатывать сообщения. И я могу получить сообщения от параметров запуска, если сообщение отправлено из центра уведомлений. Но когда в фоновом режиме отправленное сообщение - iOS отображает предупреждение - didReceiveRemoteNotification
не вызывается. Когда я нажимаю на значок приложения (не из центра уведомлений), приложение выходит на передний план, и я понятия не имею, есть ли уведомление. Любые идеи?
Получение уведомлений Push в фоновом режиме
Ответ 1
Из руководства по программированию APNS:
Давайте рассмотрим возможные сценарии, когда локальное уведомление или удаленное уведомление для приложения.
Уведомление доставляется, когда приложение не работает в на переднем плане. В этом случае система представляет уведомление, отображение предупреждения, значка значка, возможно, воспроизведение звука.
В результате представленного уведомления пользователь нажимает кнопку действия предупреждения или нажатия (или кликов) значка приложения. Если действие (на устройстве под управлением iOS), система запускает приложение и приложение называет своих делегатов application: didFinishLaunchingWithOptions: метод (если он реализован); Это проходит в полезной нагрузке уведомления (для удаленных уведомлений) или объект локального уведомления (для локальных уведомлений).
Если значок приложения отображается на устройстве с iOS, приложение вызывает тот же метод , но не предоставляет никакой информации о уведомление.
Я считаю, что последнее предложение описывает ваше дело и объясняет, почему ваше приложение не получает никакой информации об уведомлении.
Ответ 2
application:didReceiveRemoteNotification:
вызывается в фоновом режиме только тогда, когда вы добавили ключ content-available
со значением 1
в полезную нагрузку уведомления.
В случае с Урбанским дирижаблем вы можете отправить тестовое нажатие на вкладку "Настройка".
Пример полезной нагрузки для Push-уведомлений:
{
"aps": {
"alert": "aaaa",
"badge": "+1",
"content-available": "1"
},
"device_tokens": [
"86BA71E361B849E8312A7B943BA6B26A74AB436381CF3FEE3CD9EB436A12A292"
]
}
Apple четко упомянула в своей документации....
Для push-уведомления для запуска операции загрузки, полезная нагрузка уведомлений должна включать ключ, доступный для контента, с его значение установлено в 1. Когда этот ключ присутствует, система пробуждает приложение в фон (или запускает его в фоновом режиме) и вызывает приложение делегаты Применение: didReceiveRemoteNotification: fetchCompletionHandler: метод. Ваша реализация этого метода должна загружать соответствующий контент и интегрировать его в ваше приложение. https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html
Ответ 3
didReceiveRemoteNotification вызывается ТОЛЬКО, если приложение на переднем плане или приложение только что запущено или куплено с фона на передний план
Ответ 4
Метод doneFinishLaunchingWithOptions: (NSDictionary *) launchOptions. Параметр launchOptions - один из ключей словаря UIApplicationLaunchOptionsRemoteNotificationKey, который содержит нажатую информацию уведомления о нажатии.
Вы можете нажать полученную информацию после завершения основного корневого контроллера тура. Я сохраняю его для некоторого свойства, а затем выталкиваю его после инициализации представления.
if (launchOptions) {
if ([launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]) {
self.notificationToMakeAction = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
}
}