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

问题描述 投票:0回答:3

我在用户登录我的应用程序后提示用户启用推送通知。我知道如何测试是否启用或禁用推送通知:

isRegisteredForRemoteNotifications

而且效果很好。它返回 YES 表示已启用,NO 表示不可用,但我希望能够弄清楚如何检查“未确定”(系统不会提示用户首先启用推送通知)。有没有办法测试一下?

ios objective-c apple-push-notifications
3个回答
3
投票

您自己创建

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()
,警报现在由您控制。


2
投票

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")
    }

}

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
}
© www.soinside.com 2019 - 2024. All rights reserved.