我在用户登录我的应用程序后提示用户启用推送通知。我知道如何测试是否启用或禁用推送通知:
isRegisteredForRemoteNotifications
而且效果很好。它返回 YES 表示已启用,NO 表示不可用,但我希望能够弄清楚如何检查“未确定”(系统不会提示用户首先启用推送通知)。有没有办法测试一下?
您自己创建
Not Determined
状态。
func registerNotification() {
// 1.Call register API
// ...
// 2.Save a bool value to indicate you've called this method or not.
let appleSuggestedUserDefaultsKeyPrefix = "com.yourcompany.product-"
let key = appleSuggestedUserDefaultsKeyPrefix + "didCallRegisterNotificationAPI"
NSUserDefaults.standardUserDefaults().setBool(true, forKey: key)
}
在
didFinishLaunchingWithOptions
方法中,您需要检查是否已调用 registerNotification()
。
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool {
let didCallRegisterNotificationAPI = NSUserDefaults.standardUserDefaults().boolForKey(...)
if didCallRegisterNotificationAPI {
// If registered or user denied, call this method will NOT show the alert.
// Just the same as you did before.
registerNotification()
} else {
print("registerNotification() has not been called")
}
}
最后,您可以根据需要随时随地直接拨打
registerNotification()
,警报现在由您控制。
isRegisteredForRemoteNotifications
是Bool
。 不存在未确定的状态。 您可以验证这是参考。
当用户首次安装您的应用程序时,他们必须允许或禁止推送通知。 没有其他可能的选择。
但是,也许您这么问是因为您可以删除该应用程序,然后重新安装,并且它不会询问您的许可。 那是因为许可被记住了。
重置 iOS 上的推送通知权限警报 当支持推送的应用程序第一次注册推送通知时,iOS 会询问用户是否希望接收该应用程序的通知。用户响应此警报后,除非设备恢复或应用程序已卸载至少一天,否则不会再次显示。
如果您想模拟应用程序的首次运行,您可以将应用程序卸载一天。您可以按照以下步骤实现后者,而无需实际等待一天:
从设备中删除您的应用程序。 完全关闭设备并重新打开。 前往“设置”>“常规”>“日期和时间”,然后将日期提前一天或更多。 再次完全关闭设备并重新打开。
相关问题:当我删除我的 iOS 应用程序时,推送通知状态仍然存在
编辑:
您只能使用
isRegisteredForRemoteNotifications
来检查它们是否根本没有注册,无论是由于拒绝还是由于您从未尝试注册。
但是,只要您尝试以有效的方式注册(有效的证书和配置文件等)并且用户拒绝,您的应用程序就会调用 did register,但为零
UIUserNotificationSettings
:
func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) {
if notificationSettings.types == nil {
println("You didn't allow notifcations")
}
}
您可以使用UNNotificationSettings的authorizationStatus属性。
private func checkNotificationsAuthorizationStatus() {
let notificationCenter = UNUserNotificationCenter.current()
notificationCenter.getNotificationSettings { notificationSettings in
switch notificationSettings.authorizationStatus {
case .authorized:
print("Authorized to schedule or receive notifications.")
case .denied:
print("Not authorized to schedule or receive notifications.")
case .notDetermined:
print("Not determined whether the app is allowed to schedule notifications.")
case .provisional: // Available from iOS 12.0
print("Provisionally authorized to post noninterruptive user notifications.")
@unknown default:
print("Error")
}
}
}
在 didFinishLaunchingWithOptions 中使用它,例如:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
UIApplication.shared.registerForRemoteNotifications()
self.checkNotificationsAuthorizationStatus()
return true
}