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

Обнаружить "Разрешить уведомления" включено/выключено для iOS8

Я пытаюсь обнаружить локальные настройки уведомлений для приложения в iOS 8

для UIUserNotificationSettings, он возвращает мне 7, поскольку я включил все Значки, Звук и Предупреждение.

В настройке я выключаю "Разрешить оповещение", приложение все равно возвращает мне 7 для UIUserNotificationSettings (Значок, Звук и Предупреждение). Есть ли способ обнаружить "Разрешить Notification" вкл/выкл?

- (void)application:(UIApplication *)application
    didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings{

    NSLog(@"---notificationSettings.types %d" , notificationSettings.types );
    if(notificationSettings.types!=7){
        UIAlertView * alert =[[UIAlertView alloc ] initWithTitle:@"Please turn on Notification"
                                                         message:@"Go to Settings > Notifications > App.\n Switch on Sound, Badge & Alert"
                                                        delegate:self
                                               cancelButtonTitle:@"Ok"
                                               otherButtonTitles: nil];
        [alert show];
    }
}
4b9b3361

Ответ 1

Метод enabledRemoteNotificationTypes устарел с iOS8.

Чтобы проверить статус удаленных уведомлений в iOS8, вы можете позвонить

[[UIApplication sharedApplication] isRegisteredForRemoteNotifications];

он вернет НЕТ, если пользователь отключит уведомления в настройках. Documentation на isRegisteredForRemoteNotifications

Или вы можете получить все текущие настройки уведомлений:

[[UIApplication sharedApplication] currentUserNotificationSettings];

Documentation в currentUserNotificationSettings

Ответ 2

Swift 3 +

let isRegisteredForLocalNotifications = UIApplication.shared.currentUserNotificationSettings?.types.contains(UIUserNotificationType.alert) ?? false

Swift 2.3

let isRegisteredForLocalNotifications = UIApplication.sharedApplication().currentUserNotificationSettings()?.types.contains(UIUserNotificationType.Alert) ?? false

Ответ 3

Приносим извинения за этот ответ/комментарий, если он не в том месте. Я ДЕЙСТВИТЕЛЬНО новичок в программировании на iOS и никогда раньше не отправлял переполнение стека. Я думаю, что это должен быть комментарий, но без рейтинга 50 я не допускаю. Я также извиняюсь, если объяснение несколько рудиментарное, но опять-таки новое:).

Я также хотел проверить, изменился ли пользователь, какие уведомления разрешены/необходимы моему приложению после первоначального запроса. После попытки расшифровать документацию Apple (авторы в Apple гораздо умнее, чем я, или документация преднамеренно скрыта) и немного тестировали тестирование на значение

[[UIApplication sharedApplication] currentUserNotificationSettings].hash.

Я считаю, что это возвращает трехбитное хеш-значение, где бит один предназначен для уведомлений Banner, бит 2 - для звуковых уведомлений, а бит 3 - для уведомлений о предупреждении.

Итак...

000 = 0 = no notifications.
001 = 1 = only banner,
010 = 2 = only sound,
011 = 3 = sound and banner, no alert
100 = 4 = only alert notifications
and so on until,
111 = 7 = all notifications on.

Это также показывает 0, если Разрешить уведомления отключено в приложении "Настройки". Надеюсь, это поможет.

Ответ 4

Чтобы проверить статус удаленных уведомлений в iOS8 и iOS9, вы вызываете:

// Obj-C
[[UIApplication sharedApplication] isRegisteredForRemoteNotifications]; 
// Swift
UIApplication.sharedApplication().isRegisteredForRemoteNotifications

Он возвращает true, если ваше приложение может получать удаленные уведомления. Однако удаленные уведомления получать не означают, что он будет отображать их пользователю.

Запрос registerForRemoteNotifications() выполняется почти в каждом случае, и вызывается AppDelegate didRegisterForRemoteNotificationsWithDeviceToken, который дает вам токен устройства. Затем приложение может получать удаленные уведомления silent, которые не отображаются пользователю. Вы можете, например, инициировать фоновые процессы в приложении, когда такое уведомление получено. См. Documentation.

Чтобы не только получать, но и показывать удаленные уведомления пользователю, с которым вы запрашиваете разрешение:

// Swift
let notificatonSettings = UIUserNotificationSettings(forTypes: [.Badge, .Alert, .Sound], categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(notificatonSettings)

Это отобразит диалоговое окно для пользователя, где они могут разрешить или отклонить ваш запрос. Независимо от их решения приложение все равно сможет получать удаленные уведомления.

Если пользователи разрешают, вызывается AppDelegate didRegisterForRemoteNotificationsWithDeviceToken.

Чтобы проверить, разрешил ли пользователь или отклонил ваш запрос или фактически изменил разрешения уведомлений позже в настройках iOS, вы вызываете:

// Obj-C
[[UIApplication sharedApplication] currentUserNotificationSettings];
// Swift
UIApplication.sharedApplication().currentUserNotificationSettings()   

См. Documentation.

Ответ 5

Это должно работать в первый раз, когда ваше приложение запущено. Пользователь получит диалог, чтобы проверить, запрещает ли пользователь или разрешает уведомления, используйте:

-(void)application:(UIApplication *)application didRegisterUserNotificationSettings:   (UIUserNotificationSettings *)notificationSettings
{
    if (notificationSettings.types) {
        NSLog(@"user allowed notifications");
        [[UIApplication sharedApplication] registerForRemoteNotifications];
    }else{
        NSLog(@"user did not allow notifications");
        // show alert here
    }
}

При последовательных запусках используйте:

[[UIApplication sharedApplication] isRegisteredForRemoteNotifications];

Ответ 6

Вы можете управлять хэш-значением UIApplication.sharedApplication().currentUserNotificationSettings().

if(UIApplication.instancesRespondToSelector(Selector("registerUserNotificationSettings:"))){
        if(UIApplication.sharedApplication().currentUserNotificationSettings().hashValue == 0){
            pushNotificationStatus = "false"
        } else {
            pushNotificationStatus = "true"
        }
}

Ответ 7

Swift 2

В AppDelegate:

func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) {

    if (notificationSettings.types == .None){ // User did NOT allowed notifications


    }else{ // User did allowed notifications


    }

}

Из любого другого ViewController:

    if UIApplication.sharedApplication().currentUserNotificationSettings()!.types.contains(.None){

    }else{

    }

Ответ 8

Использование .isRegisteredForRemoteNotifications() не работает (хотя должно). Однако, когда уведомления отключены или один из них отсутствует, следующий код работает.

func notificationsAreOk() -> Bool {
    let wishedTypes = UIUserNotificationType.Badge |
        UIUserNotificationType.Alert |
        UIUserNotificationType.Sound;
    let application = UIApplication.sharedApplication()
    let settings = application.currentUserNotificationSettings()
    if settings == nil {
        return false
    }
    if settings.types != wishedTypes {
        return false
    }
    return true
}

EDIT: после того, как некоторые тесты не всегда работают, когда уведомления отключены. Я собираюсь отправить тестовое уведомление, чтобы знать, когда они работают.

Ответ 9

UIUserNotificationType notificationType = [[[UIApplication sharedApplication] currentUserNotificationSettings] types];

if(notificationType == UIRemoteNotificationTypeNone)
        {

            NSLog(@"OFF");
        }
        else{

            NSLog(@"ON");
        }

работает для меня

Ответ 10

Вы можете проверить, что пользовательский параметр включает или отключает Push-уведомления, используя следующий код.

Включение или отключение уведомлений Iphone Push

UIRemoteNotificationType types = [[UIApplication sharedApplication] enabledRemoteNotificationTypes];
if (types == UIRemoteNotificationTypeNone) 
  // Yes it is..

Надеюсь, это поможет вам.