我正在开发一个需要知道设备令牌的应用程序,以便在用户授权时向用户发送通知。 系统第一次要求授权进行通知。如果用户说“允许”,则系统会要求我使用方法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中,我检查用户是否已使用设备设置授予了推送通知的权限(因此不在应用程序中)。在我的应用程序的特定部分中,我使用此方法来验证用户是否已获得授权(该类始终在我的类中管理Notification Framework)。
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,因此我无法存储该令牌。向用户询问授权的警报仅在用户第一次使用时打开该应用。 下次用户打开应用程序时,系统不再显示警报。 我该如何解决这个问题?
谢谢。
答案 0 :(得分:0)
我以这种方式解决了这个问题: 在方法checkPremissionStatus中,我向我的方法registerForPushNotifications添加了一个调用,这样系统便调用了didRegisterForRemoteNotificationsWithDeviceToken方法,因此我可以在应用程序的业务逻辑中使用设备令牌。 这是在管理Notification Framework的类中修改的代码。
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
}
因此,当我检查用户权限时,我发现用户已启用(通过设备设置)推送通知用例。授权系统调用正确的方法,并且可以将设备令牌存储在用户首选项中。 / p>