Я работаю над приложением, которому нужно знать маркер устройства, чтобы отправлять уведомления пользователям, когда они дают свои полномочия.
В первый раз система запрашивает авторизацию для уведомления. Если пользователь говорит «разрешить», система вызывает для меня метод 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 не вызывается, и поэтому я не могу сохранить токен. Предупреждение о запросе у пользователя авторизации отображается только при первом использовании пользователем приложения.
В следующий раз, когда пользователь откроет приложение, система больше не будет показывать предупреждение.
Как я могу решить эту проблему?
Спасибо.