Push-уведомления и токен устройства в Swift - PullRequest
0 голосов
/ 06 сентября 2018

Я работаю над приложением, которому нужно знать маркер устройства, чтобы отправлять уведомления пользователям, когда они дают свои полномочия. В первый раз система запрашивает авторизацию для уведомления. Если пользователь говорит «разрешить», система вызывает для меня метод didRegisterForRemoteNotificationsWithDeviceToken, и в теле этого метода я пишу в UserDefaults маркер устройства. Это поток: 1) Система запрашивает разрешение 2) в didFinishLaunchingWithOptions (внутри AppDelegate) я вызываю этот метод в своем классе, который управляет платформой уведомлений:

   func registerForPushNotifications() {
        UNUserNotificationCenter.current().delegate = self
        UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) {
            (granted, error) in
            print("NFM permission granted: \(granted)")
            // 1. Check if permission granted
            guard granted else { return }
            // 2. Attempt registration for remote notifications on the main thread
            DispatchQueue.main.async {
                UIApplication.shared.registerForRemoteNotifications()
            }
        }
    }

3) система вызывает для меня метод didRegisterForRemoteNotificationsWithDeviceToken (в AppDelegate) и все работает нормально. В теле метода я пишу настройки токена UserDefaults. Второй случай случается, когда пользователь отказывает в разрешении в первый раз. Во втором случае в другом ViewController моего приложения я проверяю, дал ли пользователь разрешение на push-уведомление, используя настройки устройства (так что из приложения). В определенном разделе моего приложения я использую этот метод, чтобы проверить, дал ли пользователь разрешение (всегда в моем классе, который управляет платформой уведомлений).

    func checkPremissionStatus() -> Bool{
    var isAuth = false
    UNUserNotificationCenter.current().delegate = self
    UNUserNotificationCenter.current().getNotificationSettings { (settings) in
        print("NFM checkPremissionStatus -> notification status")
        switch settings.authorizationStatus {
        case .authorized:
            print("NFM checkPremissionStatus -> authorized status")
            self.autorizzato = true
            isAuth = true
        //TODO check pending notification...
        case .denied:
            print("NFM checkPremissionStatus -> denied status")
            self.autorizzato = false
            isAuth = false
        case .notDetermined:
            print("NFM notDetermined never see this print")
        }
    }
    return isAuth
}

В данном конкретном случае метод didRegisterForRemoteNotificationsWithDeviceToken не вызывается, и поэтому я не могу сохранить токен. Предупреждение о запросе у пользователя авторизации отображается только при первом использовании пользователем приложения. В следующий раз, когда пользователь откроет приложение, система больше не будет показывать предупреждение. Как я могу решить эту проблему?

Спасибо.

1 Ответ

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

Я решаю эту проблему следующим образом: в методе checkPremissionStatus я добавляю вызов к моему методу registerForPushNotifications, и таким образом система вызывает метод didRegisterForRemoteNotificationsWithDeviceToken, чтобы я мог использовать маркер устройства в бизнес-логике моего приложения. Это код, измененный в классе, который управляет платформой уведомлений.

    func checkPremissionStatus() -> Bool{
    var isAuth = false
    UNUserNotificationCenter.current().delegate = self
    UNUserNotificationCenter.current().getNotificationSettings { (settings) in
        print("NFM checkPremissionStatus -> notification status")
        switch settings.authorizationStatus {
        case .authorized:
            print("NFM checkPremissionStatus -> authorized status")
            self.autorizzato = true
            isAuth = true
            print("NFM checkPremissionStatus -> call registerForPushNotification")
            self.registerForPushNotifications()
        //TODO check pending notification...
        case .denied:
            print("NFM checkPremissionStatus -> denied status")
            self.autorizzato = false
            isAuth = false
        case .notDetermined:
            print("NFM notDetermined never see this print")
        }
    }
    return isAuth
}

Поэтому, когда я проверяю разрешение пользователя и обнаруживаю, что пользователь включил (из настроек устройства) случай push-уведомлений. Авторизовал системный вызов правильным методом, и я могу сохранить токен устройства в пользовательских настройках.

...