Тихое push-уведомление iOS 10 не вызывает фоновое приложение
У меня есть приложение, в котором я пытаюсь получать и обрабатывать 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)
4 ответа
Метод
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) {
}
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
center.delegate = self;
NSLog(@"%@",center.delegate);
Оформить заказ, если
center.detegate
все еще
AppDelegate
, в моем случае это было изменено на что-то вроде
X****Delegate
, так,
willPresentNotification
а также
didReceiveNotificationResponse
никогда не назывались.
Вы устанавливаете minimumBackgroundFetchInterval
? Как упомянуто в документах:
Минимальное количество секунд, которое должно пройти, прежде чем может быть инициирована очередная выборка фона. Это значение носит рекомендательный характер и не указывает точное время, ожидаемое между операциями извлечения.
Интервал выборки по умолчанию для приложений - UIApplicationBackgroundFetchIntervalNever. Следовательно, вы должны вызвать этот метод и установить интервал выборки, прежде чем вашему приложению дадут фоновое время выполнения.
Так что, если вы не устанавливаете это, вполне возможно, что ваш обработчик выборки никогда не будет вызываться в фоновом режиме.
Когда ваше приложение находится в фоновом режиме или не работает, единственный способ для вашего приложения быть уведомленным, если пользователь выбирает действие, связанное с вашим уведомлением.
См. Руководство по локальным и удаленным уведомлениям.
Когда ваше приложение не работает или находится в фоновом режиме, система автоматически доставляет локальные и удаленные уведомления, используя указанные вами взаимодействия. Если пользователь выбирает действие или выбирает одно из стандартных взаимодействий, система уведомляет ваше приложение о выборе пользователя. Ваш код может затем использовать этот выбор для выполнения дополнительных задач. Если ваше приложение работает на переднем плане, уведомления доставляются непосредственно в ваше приложение. Затем вы можете решить, обрабатывать ли уведомление тихо или предупреждать пользователя.
Чтобы ответить на доставку уведомлений, необходимо реализовать делегат для общего объекта UNUserNotificationCenter. Ваш объект делегата должен соответствовать протоколу UNUserNotificationCenterDelegate, который центр уведомлений использует для доставки информации уведомления в ваше приложение. Делегат требуется, если ваши уведомления содержат пользовательские действия.