Подтвердить что ты не робот

Настройки уведомлений iOS Push - отказано в разрешении против разрешения никогда не запрашивалось

Можно ли различать случаи, когда

  • Пользователь iOS явно отказал в разрешениях на уведомления пользователей и
  • Пользователь iOS никогда не запрашивал разрешения?

Моя ситуация: в прошлом я запрашивал разрешение на уведомление пользователя, но сам не отслеживал запросы. Позже я перестал пытаться регистрировать любые настройки уведомлений. Теперь я хотел бы повторно ввести пользовательские уведомления.

После значительного события в приложении, мой план состоит в том, чтобы отобразить какой-то пользовательский интерфейс, который объясняет преимущества выбора пользовательских уведомлений. Однако, если пользователь уже отклонил, я бы предпочел показать отдельный пользовательский интерфейс, который может передать их в Settings.app.

В настоящее время я использую -[UIApplication currentUserNotificationSettings] для захвата текущих настроек, но кажется, что это возвращает UIUserNotificationTypeNone для обоих описанных выше случаев.

4b9b3361

Ответ 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
    }
})