Настройки уведомлений iOS Push - отказано в разрешении против разрешения никогда не запрашивалось
Можно ли различать случаи, когда
- Пользователь iOS явно отказал в разрешениях на уведомления пользователей и
- Пользователь iOS никогда не запрашивал разрешения?
Моя ситуация: в прошлом я запрашивал разрешение на уведомление пользователя, но сам не отслеживал запросы. Позже я перестал пытаться регистрировать любые настройки уведомлений. Теперь я хотел бы повторно ввести пользовательские уведомления.
После значительного события в приложении, мой план состоит в том, чтобы отобразить какой-то пользовательский интерфейс, который объясняет преимущества выбора пользовательских уведомлений. Однако, если пользователь уже отклонил, я бы предпочел показать отдельный пользовательский интерфейс, который может передать их в Settings.app.
В настоящее время я использую -[UIApplication currentUserNotificationSettings]
для захвата текущих настроек, но кажется, что это возвращает UIUserNotificationTypeNone
для обоих описанных выше случаев.
Ответы
Ответ 1
Лично я не нашел способ определить это с помощью быстрого запроса IOS SDK.
Однако я смог отслеживать эту запись самостоятельно, когда вызывается -[UIApplication application:didRegisterUserNotificationSettings:]
.
Когда iOS вызывает этот метод, вы можете быть уверены, что пользователю было предложено предоставить разрешения на уведомления пользователя и (что важно) принять или отклонить его.
Сохраняя это, вы можете позже проверить это значение, чтобы определить, было ли приглашение отображаться раньше или нет.
Пример кода:
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"ABHasPromptedForUserNotification"];
//... your other notification registration handling...
}
- (BOOL)hasPromptedForUserNotification {
return [[NSUserDefaults standardUserDefaults] boolForKey:@"ABHasPromptedForUserNotification"];
}
FYI: Я считаю предпочтительным установить "ABHasPromptedForUserNotification"
как true в -[UIApplication application:didRegisterUserNotificationSettings:]
, а не при вызове -[UIApplication registerForRemoteNotifications]
, так как в некоторых ситуациях пользователю может быть предложено несколько раз. Это может произойти, если пользователь загружает приложение или принимает вызов. В этих случаях приглашение будет скрыто iOS и снова показано, если в следующий раз вы вызовете -[UIApplication registerForRemoteNotifications]
. Установка этого параметра в делегате позволяет избежать мысли о том, что пользователь был запрошен раньше и не будет запрашиваться снова в этих случаях.
Ответ 2
Нет.
И я считаю, что это сделано намеренно. Поскольку обычный сценарий заключается в регистрации для удаленных уведомлений при каждом запуске приложения. Это означает, что пользователь не должен видеть диалог с разрешениями каждый раз, когда он открывает приложение. iOS делает это автоматически. Но если вы покажете дополнительный экран перед запросом разрешений, Apple не сможет разрешить вам знать, отказался ли пользователь в прошлом, чтобы вы могли показать экран, описывающий, как пользователь может разрешать свои разрешения с помощью настроек каждый раз, когда захотите. Это отменит все Apple, чтобы перестать раздражать пользователей.
В вашем случае вы должны следовать той же стратегии. Покажите только один тип объяснительного экрана в обоих сценариях и сохраните выбор пользователя в NSUserDefaults
, чтобы узнать, не нужно ли его снова показывать. Пользователи, которые ранее отказали в разрешениях, не будут видеть диалог с разрешениями. Хотя у вас будет одно преимущество для новых пользователей (чего, очевидно, вы пытаетесь достичь): вы можете часто показывать пояснительный экран, если пользователь отменил его.
Ответ 3
Если вы поддерживаете iOS 10 и выше, структура UNUserNotifications позволяет увеличить степень детализации.
let current = UNUserNotificationCenter.current()
current.getNotificationSettings(completionHandler: { (settings) in
if settings.authorizationStatus == .notDetermined {
// Not requested
}
if settings.authorizationStatus == .denied {
// User said Don't allow
}
})