检查本地通知的授权状态
Check authorisation status of local notifications
我在我的应用程序中使用本地通知,在向用户显示新通知屏幕之前我想先检查授权状态。我使用的是 shouldPerformSegue(identifier:, sender:) -> Bool 方法,所以如果通知没有被用户授权,用户配置和保存新通知的场景不会出现:
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
if identifier == "AddReminder" {
// Check to see if notifications are authorised for this app by the user
let isAuthorised = NotificationsManager.checkAuthorization()
if isAuthorised {
print(isAuthorised)
return true
}
else {
let alert = UIAlertController(title: "Title", message: "Message", preferredStyle: .alert)
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) {
(action: UIAlertAction) in
}
let settingsAction = UIAlertAction(title: "Settings", style: .default) { (_) -> Void in
guard let settingsURL = URL(string: UIApplicationOpenSettingsURLString) else {
return
}
if UIApplication.shared.canOpenURL(settingsURL) {
UIApplication.shared.open(settingsURL, options: [:], completionHandler: { (success) in
print("Settings opened: \(success)")
})
}
}
alert.addAction(cancelAction)
alert.addAction(settingsAction)
present(alert, animated: true, completion: nil)
print(isAuthorised)
return false
}
}
// By default, transition
return true
}
以下是我用于授权检查的方法:
static func checkAuthorization() -> Bool {
// var isAuthorised: Bool
var isAuthorised = true
UNUserNotificationCenter.current().getNotificationSettings { (notificationSettings) in
switch notificationSettings.authorizationStatus {
case .notDetermined:
self.requestAuthorization(completionHandler: { (success) in
guard success else { return }
})
print("Reached .notDetermined stage")
case .authorized:
isAuthorised = true
case .denied:
isAuthorised = false
}
}
//print("Last statement reached before the check itself")
return isAuthorised
}
我发现上面函数中的最后一条语句 (return isAuthorized) returned 在 UNUserNotificationCenter.current().getNotificationSettings{} 的主体被执行之前,因此它总是return无论 isAuthorized 配置到什么,在方法的最开始。
问题:
你能否建议我如何使用更好的方法检查授权,因为我的方法甚至不起作用。
这只是我的第一个 IOS 应用程序,所以我对 IOS 开发还比较陌生;任何帮助将不胜感激。
如果有人遇到类似问题,那么不要使用 getNotificationsSettings(){} 方法,该方法将在返回封闭方法后计算;我们可以使用不同的方法,即获取 currentUserNotificationSettings,这是我们应用程序的通知设置。然后检查当前设置是否包含.aler、.sound 等。如果答案是肯定的,那么我们可以确定应用程序启用了通知。
我在我的应用程序中使用本地通知,在向用户显示新通知屏幕之前我想先检查授权状态。我使用的是 shouldPerformSegue(identifier:, sender:) -> Bool 方法,所以如果通知没有被用户授权,用户配置和保存新通知的场景不会出现:
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
if identifier == "AddReminder" {
// Check to see if notifications are authorised for this app by the user
let isAuthorised = NotificationsManager.checkAuthorization()
if isAuthorised {
print(isAuthorised)
return true
}
else {
let alert = UIAlertController(title: "Title", message: "Message", preferredStyle: .alert)
let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) {
(action: UIAlertAction) in
}
let settingsAction = UIAlertAction(title: "Settings", style: .default) { (_) -> Void in
guard let settingsURL = URL(string: UIApplicationOpenSettingsURLString) else {
return
}
if UIApplication.shared.canOpenURL(settingsURL) {
UIApplication.shared.open(settingsURL, options: [:], completionHandler: { (success) in
print("Settings opened: \(success)")
})
}
}
alert.addAction(cancelAction)
alert.addAction(settingsAction)
present(alert, animated: true, completion: nil)
print(isAuthorised)
return false
}
}
// By default, transition
return true
}
以下是我用于授权检查的方法:
static func checkAuthorization() -> Bool {
// var isAuthorised: Bool
var isAuthorised = true
UNUserNotificationCenter.current().getNotificationSettings { (notificationSettings) in
switch notificationSettings.authorizationStatus {
case .notDetermined:
self.requestAuthorization(completionHandler: { (success) in
guard success else { return }
})
print("Reached .notDetermined stage")
case .authorized:
isAuthorised = true
case .denied:
isAuthorised = false
}
}
//print("Last statement reached before the check itself")
return isAuthorised
}
我发现上面函数中的最后一条语句 (return isAuthorized) returned 在 UNUserNotificationCenter.current().getNotificationSettings{} 的主体被执行之前,因此它总是return无论 isAuthorized 配置到什么,在方法的最开始。
问题: 你能否建议我如何使用更好的方法检查授权,因为我的方法甚至不起作用。
这只是我的第一个 IOS 应用程序,所以我对 IOS 开发还比较陌生;任何帮助将不胜感激。
如果有人遇到类似问题,那么不要使用 getNotificationsSettings(){} 方法,该方法将在返回封闭方法后计算;我们可以使用不同的方法,即获取 currentUserNotificationSettings,这是我们应用程序的通知设置。然后检查当前设置是否包含.aler、.sound 等。如果答案是肯定的,那么我们可以确定应用程序启用了通知。