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