IOS 10 тихий push-уведомление не запускает фоновые приложения
У меня есть приложение, в котором я пытаюсь получить и обрабатывать SILENT push-уведомления.
Я регистрируюсь для APN следующим образом:
UNUserNotificationCenter.currentNotificationCenter().delegate = self
UNUserNotificationCenter.currentNotificationCenter().requestAuthorizationWithOptions([.Badge, .Sound, .Alert]) {(granted, error) in
if granted {
application.registerForRemoteNotifications()
}
}
Реализовано:
func userNotificationCenter(center: UNUserNotificationCenter, didReceiveNotificationResponse response: UNNotificationResponse, withCompletionHandler completionHandler: () -> Void) {
// Handle notification
}
func userNotificationCenter(center: UNUserNotificationCenter, willPresentNotification notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void) {
// Handle notification
}
Приложение имеет UIBackgroundModes
fetch
и remote-notification
Содержимое APN выглядит следующим образом:
{
"aps":{
"content-available":1,
"badge":0
},
"action":"shareDelete",
"shareId":633
}
Когда приложение находится на переднем плане, userNotificationCenter(centre:withCompletionHandler:willPresentNotification)
запускается при получении уведомления, но когда приложение зашифровывается, ничего не происходит.
Я вижу, что APN получен путем изменения номера значка, но ничего не запускается в приложении.
Что мне не хватает?
(Также спросил на форумах Apple dev)
Ответы
Ответ 1
Метод
func userNotificationCenter(center: UNUserNotificationCenter, didReceiveNotificationResponse response: UNNotificationResponse, withCompletionHandler completionHandler: () -> Void) {
// Handle notification
}
когда пользователь нажимает на уведомление или проверяет его на Apple Watch:
Вызывается, чтобы ваше приложение узнало, какое действие было выбрано пользователем для данного уведомления.
Вам нужно реализовать старый метод
func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
}
Ответ 2
Вы устанавливаете minimumBackgroundFetchInterval
? Как упоминалось в документах:
Минимальное количество секунд, которое должно пройти до того, как будет выполнена другая выборка фона. Это значение является только рекомендательным и не указывает точное время, ожидаемое между операциями выборки.
Интервал выборки по умолчанию для приложений - UIApplicationBackgroundFetchIntervalNever. Поэтому вы должны вызвать этот метод и установить интервал выборки, прежде чем вашему приложению будет предоставлено время выполнения фона.
Итак, если вы не устанавливаете это, вполне возможно, что ваш обработчик fetch никогда не будет вызван в фоновом режиме.
Ответ 3
Когда ваше приложение находится в фоновом режиме или не работает, единственным способом уведомления вашего приложения является выбор пользователем действия, связанного с вашим уведомлением.
См. Руководство по локальным и удаленным уведомлениям.
Когда ваше приложение не работает или находится в фоновом режиме, система автоматически отправляет локальные и удаленные уведомления с использованием указанных вами взаимодействий. Если пользователь выбирает действие или выбирает одно из стандартных взаимодействий, система уведомляет ваше приложение о выборе пользователей. Затем ваш код может использовать этот выбор для выполнения дополнительных задач. Если ваше приложение работает на переднем плане, уведомления доставляются непосредственно в ваше приложение. Затем вы можете решить, следует ли обращаться с уведомлением тихо или предупредить пользователя.
Чтобы ответить на доставку уведомлений, вы должны реализовать делегат для общего объекта UNUserNotificationCenter. Объект вашего делегата должен соответствовать протоколу UNUserNotificationCenterDelegate, который центр уведомлений использует для доставки уведомлений в ваше приложение. Делегат требуется, если ваши уведомления содержат пользовательские действия.
вот источник:
https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/SchedulingandHandlingLocalNotifications.html#//apple_ref/doc/uid/TP40008194-CH5-SW14