Я создаю приложение, которое предназначено для iOS7 и iOS8. Я прошу у пользователя разрешения на отправку push-уведомлений. Но по какой-то причине ни iOS7, ни iOS8 никогда не назовет моего обработчика application:didFailToRegisterForRemoteNotificationsWithError
, если я нажму "No", когда вас попросят разрешить push.
Мой вопрос:, как я узнаю, как на iOS7, так и на iOS8, когда пользователь отклонил запрос на push-уведомления - и как узнать, отклонили ли они запрос?
Я посмотрел на кучу ответов StackOverflow и реализовал то, что они предлагают, но он не работает как документированный:
- iOS7: если пользователь одобряет запрос, система вызывает мой обработчик
application:didRegisterForRemoteNotificationsWithDeviceToken:
. Поэтому я могу сказать, что они одобрили это. Но если пользователь отказывает в запросе, тогда я не получаю обратный вызовapplication:didFailToRegisterForRemoteNotificationsWithError
. Это похоже на ошибку, и я не могу сказать, что пользователь отказал в запросе. - iOS8: если пользователь одобряет или отклоняет запрос, система вызывает мой обработчик
application:didRegisterUserNotificationSettings
. Я могу посмотреть параметрnotificationSettings
, чтобы убедиться, что пользователь одобрил или отклонил мой запрос, так что это удобно.Однако, если я впоследствии вызовуОбновление: если я впоследствии позвонюisRegisteredForRemoteNotifications()
(например, когда приложение станет активным позже), он всегда возвращает true, даже если пользователь отказал в запросе. Поэтому я получаю ложный результат. Это похоже на ошибку, и я вижу, что другие тоже это заметили.let settings = UIApplication.sharedApplication().currentUserNotificationSettings()
, я могу проверитьsettings.types
чтобы узнать, разрешены ли предупреждения. Итак, для iOS8, похоже, я все настроен.
Я использую NSUserDefaults
boolean для отслеживания того, спросил ли я пользователя о предоставлении разрешения.
Я использую аппаратные устройства для тестирования (iPhone 4S с iOS7 и iPhone 5 с iOS8), а не симулятор.
Я сброс моего устройства после каждого теста, чтобы он снова показывал запрос.
Здесь, как я регистрирую для push-уведомлений. Ветвь if
берется на iOS8, а ветвь else
берется на iOS7:
let application = UIApplication.sharedApplication()
if (application.respondsToSelector("registerUserNotificationSettings:")) {
let settings = UIUserNotificationSettings(forTypes: .Badge | .Alert | .Sound,
categories: nil )
application.registerUserNotificationSettings(settings)
} else {
application.registerForRemoteNotificationTypes(.Badge | .Alert | .Sound)
}
(В iOS8, когда вызывается application:didRegisterUserNotificationSettings:
, я вызываю application.registerForRemoteNotifications()
).