Как я могу написать код, который компилируется с Xcode 9.x (iOS11) и Xcode10.x (iOS12) при использовании UNAuthorizationStatus.provisional? - PullRequest
0 голосов
/ 05 сентября 2018

Здравствуйте, у меня есть некоторый код switch case, который обрабатывает UNAuthorizationStatus, так как с iOS12 был добавлен новый статус: .provisional. В C или другом старом стиле компилятора я бы написал директиву прекомпилятора для окружения кода обработки .provisional, однако в swift, что, похоже, приводит к ошибкам.

private func checkNotificationSettings() {
    UNUserNotificationCenter.current().getNotificationSettings { settings in
        switch settings.authorizationStatus {
        if #available(iOS 12.0, *) { // ERROR here
        case .provisional: // ERROR here too
            // Do my thing
        }
        case .authorized:
            // Do my thing
        case .notDetermined:
            // Request authorization and if granted do my thing
        case .denied:
            // Do not do my thing
        }
    }
}

Ошибки:

Переключатель должен быть исчерпывающим
Все операторы внутри переключателя должны быть заключены в «case» или «default»

Есть ли какой-нибудь умный способ справиться с этим? Я хотел бы избежать этого, потому что это слишком долго и повторяется:

if #available(iOS 12.0, *) {
    NUserNotificationCenter.current().getNotificationSettings { settings in 
        switch settings.authorizationStatus {
        case .provisional:
        ...
    }
} else {
    NUserNotificationCenter.current().getNotificationSettings { settings in 
        switch settings.authorizationStatus {
        ...
    }
}

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

Это не самое элегантное решение, но его просто использовать if else вместо switch. В моем случае я переназначаю .provisional на .authorized. Что-то вроде:

func didTapNotificationsCell(authorizationStatus: UNAuthorizationStatus) {
    if #available(iOS 12.0, *), authorizationStatus == .provisional {
        handleCommonStatus(.authorized)
    } else {
        handleCommonStatus(authorizationStatus)
    }
}

private func handleCommonStatus(_ status: UNAuthorizationStatus) {
    if status == .authorized {
        // Do something

    } else if status == .notDetermined {
        UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { (_, _) in
        }

    } else if status == .denied {

    }
}
0 голосов
/ 05 сентября 2018

Вы можете сделать все обычные случаи как обычно и добавить доступные проверки в части по умолчанию, как это

NUserNotificationCenter.current().getNotificationSettings { settings in 
    switch settings.authorizationStatus {
        case .stateX:
         //do stuff
        default:
          if #available(iOS 12.0, *) {
               if settings.authorizationStatus == .provisional {
                //Handle case
               }
          }
    }
}
...