检查是否未确定iOS推送通知状态

时间:2015-05-06 22:10:20

标签: ios objective-c

我提示用户在用户登录我的应用后启用推送通知。我知道如何使用以下方法测试推送通知是否已启用:

isRegisteredForRemoteNotifications

它工作得很好。它返回YES表示启用,NO表示不可用,但我希望能够弄清楚如何检查Not Determined(未提示用户启用推送通知)。有没有办法测试?

提前致谢!

3 个答案:

答案 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)

isRegisteredForRemoteNotificationsBool。没有未确定的状态。您可以验证这是reference

当用户首次安装您的应用时,他们必须允许或禁止推送通知。没有其他可能的选择。

但是,您可能会问,因为您可以删除该应用,重新安装,但它不会要求您获得许可。这是因为记住了许可。

  

重置iOS上的推送通知权限警报   第一次启用推送的应用程序注册推送通知时,iOS会询问用户是否希望接收该应用程序的通知。一旦用户响应此警报,除非设备已恢复或应用程序已卸载至少一天,否则不会再次显示该警报。

如果您想模拟首次运行的应用,可以将应用程序卸载一天。您可以通过以下步骤实现后者而无需等待一天:

从设备中删除您的应用。 完全关闭设备并重新打开。 转到设置>一般>日期&时间并将日期设定为一天或更长时间。 再次完全关闭设备并重新打开。

Reference

相关问题: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
}