Проверьте, включены ли локальные уведомления в IOS 8

Я искал во всем Интернете, как создавать локальные уведомления с помощью IOS 8. Я нашел много статей, но ни одна из них не объясняла, как определить, был ли пользователь включен или отключен "оповещения". Может кто-нибудь, пожалуйста, помогите мне! Я бы предпочел использовать Objective C вместо Swift.

8 ответов

Решение

Вы можете проверить это с помощью UIApplication currentUserNotificationSettings

if ([[UIApplication sharedApplication] respondsToSelector:@selector(currentUserNotificationSettings)]){ // Check it's iOS 8 and above
    UIUserNotificationSettings *grantedSettings = [[UIApplication sharedApplication] currentUserNotificationSettings];

    if (grantedSettings.types == UIUserNotificationTypeNone) {
        NSLog(@"No permiossion granted");
    }
    else if (grantedSettings.types & UIUserNotificationTypeSound & UIUserNotificationTypeAlert ){
        NSLog(@"Sound and alert permissions ");
    }
    else if (grantedSettings.types  & UIUserNotificationTypeAlert){
        NSLog(@"Alert Permission Granted");
    }
}

Надеюсь, это поможет, дайте мне знать, если вам нужно больше информации

Чтобы расширить ответ Альберта, вы не обязаны использовать rawValue в Свифте. Так как UIUserNotificationType соответствует OptionSetType можно сделать следующее:

if let settings = UIApplication.shared.currentUserNotificationSettings {
    if settings.types.contains([.alert, .sound]) {
        //Have alert and sound permissions
    } else if settings.types.contains(.alert) {
        //Have alert permission
    }
}

Вы используете кронштейн [] синтаксис для объединения типов опций (аналогично побитовой или | оператор объединения флагов опций на других языках).

Вот простая функция в Swift 3, которая проверяет, включен ли хотя бы один тип уведомлений.

Наслаждайтесь!

static func areNotificationsEnabled() -> Bool {
    guard let settings = UIApplication.shared.currentUserNotificationSettings else {
        return false
    }

    return settings.types.intersection([.alert, .badge, .sound]).isEmpty != true
}

Спасибо Михал Колунны за вдохновение.

Свифт с guard:

guard let settings = UIApplication.sharedApplication().currentUserNotificationSettings() where settings.types != .None else {
    return
}

Изменить: Посмотрите на ответ@ Симеон.

В Swift вам нужно использовать rawValue:

let grantedSettings = UIApplication.sharedApplication().currentUserNotificationSettings()
if grantedSettings.types.rawValue & UIUserNotificationType.Alert.rawValue != 0 {
    // Alert permission granted
} 

Используя ответ @simeon, Xcode говорит мне, что

'currentUserNotificationSettings' устарел в iOS 10.0: используйте UserNotification Framework's -[UNUserNotificationCenter getNotificationSettingsWithCompletionHandler:] и -[UNUserNotificationCenter getNotificationCategoriesWithCompletionHandler:]

Итак, вот решение, использующее UNUserNotificationCenter для Swift 4:

UNUserNotificationCenter.current().getNotificationSettings(){ (settings) in

        switch settings.alertSetting{
        case .enabled:

            //Permissions are granted

        case .disabled:

            //Permissions are not granted

        case .notSupported:

            //The application does not support this notification type
        }
    }

Я думаю, что этот код является более точным:

if ([[UIApplication sharedApplication] respondsToSelector:@selector(currentUserNotificationSettings)]) {

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

    if (types & UIUserNotificationTypeBadge) {
        NSLog(@"Badge permission");
    }
    if (types & UIUserNotificationTypeSound){
        NSLog(@"Sound permission");
    }
    if (types & UIUserNotificationTypeAlert){
        NSLog(@"Alert permission");
    }
}

Цель C + iOS 10

  UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
  [center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {

        switch (settings.authorizationStatus) {
            case UNAuthorizationStatusNotDetermined:

                break;

            case UNAuthorizationStatusDenied:

                break;

            case UNAuthorizationStatusAuthorized:

                break;

            default:
                break;
        }
    }];
Другие вопросы по тегам