Проверьте, включены ли пользовательские уведомления после устаревания UILocalNotification.

В моем приложении я хочу иметь возможность проверить, включены ли у пользователя уведомления или нет. В iOS 10 я сделал это с помощью проверки в делегате.

Эта проверка устарела, и я хочу ее обновить, но не могу понять, что использовать в iOS 11.

Предупреждение об устаревании выглядит следующим образом:

currentUserNotificationSettings» устарела в iOS 10.0: используйте UserNotifications Framework — [UNUserNotificationCenter getNotificationSettingsWithCompletionHandler:] и — [UNUserNotificationCenter getNotificationCategoriesWithCompletionHandler:]

Я пытался обновить код с помощью этого предупреждения, но не могу понять.

Если кто-нибудь может предложить в любом случае получить чек, как это работает, это очень помогло бы. Код, который я использовал для iOS 10, приведен ниже, спасибо.

let notificationType = UIApplication.shared.currentUserNotificationSettings!.types
if notificationType == [] {
    print("Notifications are NOT enabled")
} else {
    print("Notifications are enabled")
}

person Ethan Humphries    schedule 10.10.2017    source источник


Ответы (3)


Шаг 1: import UserNotifications

Шаг 2 :

UNUserNotificationCenter.current().getNotificationSettings { (settings) in
  if settings.authorizationStatus == .authorized {
    // Notifications are allowed
  }
  else {
    // Either denied or notDetermined
  }
}

Проверьте объект настроек для получения дополнительной информации.

person Adam    schedule 10.10.2017
comment
как вы справляетесь с этим в до iOS 10? - person Josh; 15.11.2017
comment
Вам нужно будет получить объект UIUserNotificationSettings из UIApplication.shared с помощью метода currentUserNotificationSettings. - person Adam; 18.11.2017
comment
Как вы конвертируете это в функцию, которая вызывает Bool()? - person Vetuka; 19.12.2017

Первый шаг:- вы должны добавить заголовочный файл как

import UserNotifications

Я использовал метод checkpushNotification, чтобы проверить, включает ли пользователь уведомление или нет. Использование вызывает этот метод из didFinishLaunchingWithOptions класса AppDelegate. Надеюсь, это поможет вам, если возникнут какие-либо проблемы, прокомментируйте ниже.

Последний шаг:-

func checkPushNotification(){
        if #available(iOS 10.0, *) {
            UNUserNotificationCenter.current().getNotificationSettings(){ (setttings) in

                switch setttings.authorizationStatus{
                case .authorized:

                    print("enabled notification setting")

                case .denied:

                    print("setting has been disabled")

                case .notDetermined:
                    print("something vital went wrong here")
                }
            }
        } else {

            let isNotificationEnabled = UIApplication.shared.currentUserNotificationSettings?.types.contains(UIUserNotificationType.alert)
            if isNotificationEnabled{

                print("enabled notification setting")
            }else{

                print("setting has been disabled")
            }
        }
    }

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

func checkPushNotification(checkNotificationStatus isEnable : ((Bool)->())? = nil){

        if #available(iOS 10.0, *) {
            UNUserNotificationCenter.current().getNotificationSettings(){ (setttings) in

                switch setttings.authorizationStatus{
                case .authorized:

                    print("enabled notification setting")
                    isEnable?(true)
                case .denied:

                    print("setting has been disabled")
                    isEnable?(false)
                case .notDetermined:

                    print("something vital went wrong here")
                    isEnable?(false)
                }
            }
        } else {

            let isNotificationEnabled = UIApplication.shared.currentUserNotificationSettings?.types.contains(UIUserNotificationType.alert)
            if isNotificationEnabled == true{

                print("enabled notification setting")
                isEnable?(true)

            }else{

                print("setting has been disabled")
                isEnable?(false)
            }
        }
    }

и назовите это простым как

  self.checkPushNotification {  (isEnable) in
    print(isEnable)
    // you know notification status.
}
person Amrit Tiwari    schedule 10.10.2017
comment
а для более ранних версий? - person Josh; 15.11.2017
comment
@Josh Джош, я обновил более раннюю версию выше. Если это не сработало, пожалуйста, прокомментируйте ниже. - person Amrit Tiwari; 16.11.2017
comment
@ Амрит Тивари означает ли это, что если isNotificationEnabled = false, это было отклонено? работает ли он так же, как и в предыдущем случае переключения в вашем примере? - person Josh; 20.11.2017
comment
isNotificationEnabled = false, это как для случая, когда пользователю отказано, так и для случая, когда он не определен. - person Amrit Tiwari; 21.11.2017
comment
Привет, Амрит, не могли бы вы показать мне, как в результате преобразовать вашу функцию в метод throw Bool()? например -> Bool()? - person Vetuka; 19.12.2017
comment
@AmritTiwari, ты можешь поделиться, как ты бросил здесь bool()? - person Desmond; 16.07.2018
comment
@Desmond, я обновил ответ, пожалуйста, посмотрите и надеюсь, что это решит вашу проблему. если какая-либо путаница, не стесняйтесь спрашивать. - person Amrit Tiwari; 16.07.2018
comment
@AmritTiwari спасибо за правки! Знаете ли вы, как я могу получить обратный вызов getNotificationSettings для синхронного метода и вернуть Bool? - person Desmond; 16.07.2018
comment
@Desmond, почему тебе нужен синхронный метод? - person Amrit Tiwari; 16.07.2018

Я думаю, вы можете просто позвонить UIApplication.shared.isRegisteredForRemoteNotifications

person David Cespedes    schedule 19.09.2019