didRegisterForRemoteNotificationsWithDeviceToken не срабатывает - Pu sh Уведомления не работают - PullRequest
0 голосов
/ 10 апреля 2020

Я часами пытался выяснить, почему didRegisterForRemoteNotificationsWithDeviceToken не вызывается. Это работало раньше. Я не трогал это неделями. Теперь перестал работать.

Вот мои настройки:

  1. Получил didRegisterForRemoteNotificationsWithDeviceToken сидя в SceneDelegate
  2. Объявили SceneDelegate как UNUserNotificationCenterDelegate
  3. Я устанавливаю UNUserNotificationCenter.current().delegate = self в func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)
  4. Я звоню UNUserNotificationCenter.current().requestAuthorization { granted, error in... из одного из UIViewControllers в моем приложении, в частности в viewDidLoad этого контроллера - я получаю Разрешение всплывающее окно и при принятии я получаю true обратно для granted
  5. В течение UNUserNotificationCenter.current().getNotificationSettings { settings in ... чек на settings.authorizationStatus == .authorized возвращает true
  6. Pu sh Уведомления добавлен в качестве возможности для приложения в «Подписи и возможности», и файл прав был создан. Я даже уже удалил и заново создал файл прав - просто чтобы быть уверенным ...
  7. Я убедился, что приложение запущено на реальном устройстве (как через Xcode, так и через TestFlight) - поэтому делегат, который не вызывается, не связан с приложением, запущенным в симуляторе.
  8. Проверил, если хотя бы вместо этого вызывается didFailToRegisterForRemoteNotificationsWithError, но это не так.
  9. У меня есть пробовал со вторым физическим устройством, которое я никогда раньше не использовал для тестирования.
  10. Я даже проверил состояние песочницы APNS здесь: https://developer.apple.com/system-status/
  11. didReceive делегат вызывается, хотя, если я отправляю тестовое уведомление симулятору с помощью команды терминала xcrun simctl push... и получаю уведомление.
  12. Профиль обеспечения управляется Xcode, и указанный AppID настроен для Pu sh Уведомления. Сертификаты настраиваются в учетной записи разработчика Apple.

Вот как я запрашиваю авторизацию у пользователя в пределах viewDidLoad одного из моих приложений UIViewControlles

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

А вот и метод делегата didRegisterForRemoteNotificationsWithDeviceToken, находящийся внутри SceneDelegate. Примечание: я также устанавливаю UNUserNotificationCenter.current().delegate = self в scene willConnectTo and declared протокол SceneDelegate to implement the UNUserNotificationCenterDelegate`.

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        let token = deviceToken.map { String(format:"%02.2hhx", $0) }.joined()
        print("didRegisterForRemoteNotificationsWithDeviceToken GOT CALLED - APNS TOKEN IS: \(token)")

        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)")
            }
        })

    }

Что бы я ни делал, didRegisterForRemoteNotificationsWithDeviceToken не запускается. У меня заканчиваются идеи о том, что идет не так.

Где ошибка? Как я могу заставить didRegisterForRemoteNotificationsWithDeviceToken выполнить снова?

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

Я думаю, что вы ошиблись на втором шаге didRegisterForRemoteNotificationsWithDeviceToken, didFailToRegisterForRemoteNotificationsWithError делегаты доступны в UIApplicationDelegate не в UNUserNotificationCenterDelegate

Добавьте UIApplicationDelegate к вашему Класс SceneDelegate и функция willConnectTo устанавливают делегата следующим образом:

UIApplication.shared.delegate = self

Надеюсь, это сработает ... дайте мне знать, если проблема не исчезла.

0 голосов
/ 15 апреля 2020

Удостоверились ли вы, что используете правильный профиль обеспечения, в котором используется идентификатор приложения с поддержкой уведомлений pu sh? Этого нет в ваших шагах.

Поскольку я пока не имею права оставлять комментарии, отправляю это в ответ.

...