我提示用户在用户登录我的应用后启用推送通知。我知道如何使用以下方法测试推送通知是否已启用:
isRegisteredForRemoteNotifications
它工作得很好。它返回YES表示启用,NO表示不可用,但我希望能够弄清楚如何检查Not Determined(未提示用户启用推送通知)。有没有办法测试?
提前致谢!
答案 0 :(得分:2)
您自己创建div
州。
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")
}
}
,现在您可以控制警报。
答案 1 :(得分:1)
isRegisteredForRemoteNotifications
是Bool
。没有未确定的状态。您可以验证这是reference。
当用户首次安装您的应用时,他们必须允许或禁止推送通知。没有其他可能的选择。
但是,您可能会问,因为您可以删除该应用,重新安装,但它不会要求您获得许可。这是因为记住了许可。
重置iOS上的推送通知权限警报 第一次启用推送的应用程序注册推送通知时,iOS会询问用户是否希望接收该应用程序的通知。一旦用户响应此警报,除非设备已恢复或应用程序已卸载至少一天,否则不会再次显示该警报。
如果您想模拟首次运行的应用,可以将应用程序卸载一天。您可以通过以下步骤实现后者而无需等待一天:
从设备中删除您的应用。 完全关闭设备并重新打开。 转到设置>一般>日期&时间并将日期设定为一天或更长时间。 再次完全关闭设备并重新打开。
相关问题:When I delete my iOS application push notification state remains
修改强>
您只能使用isRegisteredForRemoteNotifications
检查他们是否未注册,无论是由于拒绝还是由于您从未尝试过注册。
但是,只要您尝试以有效的方式注册(有效的证书和个人资料等)并且用户拒绝,您的应用就会调用did register,但使用nil UIUserNotificationSettings
:
func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) {
if notificationSettings.types == nil {
println("You didn't allow notifcations")
}
}
答案 2 :(得分:0)
您可以使用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
}