Обнаружить "Разрешить уведомления" вкл / выкл для 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];
    }
}

11 ответов

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

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

[[UIApplication sharedApplication] isRegisteredForRemoteNotifications];

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

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

[[UIApplication sharedApplication] currentUserNotificationSettings];

Документация по currentUserNotificationSettings

Свифт 3+

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

Swift 2.3

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

Я прошу прощения за этот ответ / комментарий, если он не в том месте. Я ДЕЙСТВИТЕЛЬНО новичок в программировании на 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, если Разрешить уведомления отключены в приложении Настройки. Надеюсь это поможет.

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

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

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

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

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

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

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

Если пользователи позволяют, AppDelegate's didRegisterForRemoteNotificationsWithDeviceToken называется.

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

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

Смотрите документацию.

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

-(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];
UIUserNotificationType notificationType = [[[UIApplication sharedApplication] currentUserNotificationSettings] types];

if(notificationType == UIRemoteNotificationTypeNone)
        {

            NSLog(@"OFF");
        }
        else{

            NSLog(@"ON");
        }

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

Вы можете контролировать значение хеша UIApplication.sharedApplication().currentUserNotificationSettings(),

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

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{

    }

Проверь это. Код опробован и протестирован.

- (BOOL)isUserNotificationAllowed {
    UIUserNotificationType types = [[UIApplication sharedApplication] currentUserNotificationSettings].types;
    if(types & UIUserNotificationTypeBadge || types & UIUserNotificationTypeSound || types & UIUserNotificationTypeAlert){
        return YES;
    }
    else {
        return NO;
    }
}

С помощью .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
}

РЕДАКТИРОВАТЬ: после некоторых тестов не всегда работает, когда уведомления отключены. Я планирую отправить тестовое уведомление, чтобы узнать, когда они работают.

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

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

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

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

Другие вопросы по тегам