didRegisterForRemoteNotificationsWithDeviceToken не вызывается при предоставлении пользователю разрешения на получение уведомлений pu sh - PullRequest
0 голосов
/ 26 марта 2020

Я настроил didRegisterForRemoteNotificationsWithDeviceToken в AppDelegate примерно так:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        let token = deviceToken.map { String(format:"%02.2hhx", $0) }.joined()
        print("didRegisterForRemoteNotificationsWithDeviceToken got called - Token is: \(token)")
        // delegate might get called even before an authtoken has been set for the user. Return in such cases:
        guard UserDefaults.standard.string(forKey: "authtoken") != nil else {return}

        // otherwise continue:
        if (token != UserDefaults.standard.string(forKey: "apnsToken")) {
            self.apiService.setAPNSToken(apnsToken: token, completion: {result in
                switch result {
                case .success(let resultString):
                    DispatchQueue.main.async {
                        UserDefaults.standard.set(token, forKey: "apnsToken")
                        print(resultString, " Token is: \(token)")
                    }
                case .failure(let error):
                    print("An error occured \(error.localizedDescription)")
                }
            })
        } else {
            print("User is registered for Push Notifications. Token did not change and is: \(token)")
        }

    }

Я запрашиваю разрешение пользователя на отправку pu sh Уведомлений в одном из моих контроллеров представления, например так:

UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { granted, error in
            DispatchQueue.main.async {
                if (granted) {
                    UserDefaults.standard.set(true, forKey: "pushNotificationsEnabled")
                }
                print("permission granted?: \(granted)")
            }
        }

Все довольно стандартно, я полагаю. Моя путаница / проблема заключается в следующем: didRegisterForRemoteNotificationsWithDeviceToken не вызывается при взаимодействии с пользователем - то есть я ожидаю, что он будет вызван, как только пользователь нажмет на «allow pu sh notifications», чтобы токен apns был сохранен на моей спине конец. Но это не так. Когда я закрываю приложение и запускаю его снова, didRegisterForRemoteNotificationsWithDeviceToken вызывается, и токен сохраняется в бэкэнде.

Что мне нужно сделать, чтобы получить доступ к токену и сохранить его в бэкэнде для пользователя нажав на кнопку «разрешить уведомления pu sh»?

1 Ответ

1 голос
/ 26 марта 2020

Когда ваш пользователь подтверждает, что ему нужны уведомления, вы должны позвонить UIApplication.shared.registerForRemoteNotifications(). Не похоже, что вы делаете это.

Вы можете сделать что-то вроде этого

UNUserNotificationCenter.current()
  .requestAuthorization(options: [.alert, .sound, .badge]) {
    [weak self] granted, error in

    print("Permission granted: \(granted)")
    guard granted else { return }
    self?.getNotificationSettings()
}

Затем getNotificationSettings проверяет, что оно было авторизовано перед регистрацией для удаленных уведомлений.

func getNotificationSettings() {
  UNUserNotificationCenter.current().getNotificationSettings { settings in
    print("Notification settings: \(settings)")

    guard settings.authorizationStatus == .authorized else { return }

    DispatchQueue.main.async {
       UIApplication.shared.registerForRemoteNotifications()
    }
  }
}

Подробнее о том, как обрабатывать уведомления pu sh, можно прочитать в этом Ray Wenderlich tutorial .

...