iOS推送通知设置 – 拒绝权限与永远不会请求的权限

是否有可能区分哪些情况

  1. 一个iOS用户明确拒绝了用户通知的权限,并且
  2. 一个iOS用户从来没有被提示要求权限?

我的情况:过去,我提示用户通知许可,但从来没有跟踪过请求。 稍后,我停止尝试注册任何通知设置。 现在,我想重新介绍用户通知。

在应用程序发生重大事件后,我的计划是显示某种用户界面,说明select用户通知的好处。 但是,如果用户已经拒绝,我宁愿显示一个单独的用户界面,可以把他们带到Settings.app。

目前,我正在使用-[UIApplication currentUserNotificationSettings]来获取当前的设置,但是看起来这UIUserNotificationTypeNone为上述两种情况返回UIUserNotificationTypeNone

我个人还没有find一种方法来通过iOS SDK的快速查询来确定这一点。

但是当我调用了-[UIApplication application:didRegisterUserNotificationSettings:]时,我已经能够跟踪这个自己的logging了。

当iOS调用此方法时,可以确保用户已被提示input用户通知权限,并且(重要)已被接受或拒绝。

当发生这种情况时,您可以稍后检查此值以确定提示是否已在之前显示。

示例代码:

 - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings { [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"ABHasPromptedForUserNotification"]; //... your other notification registration handling... } - (BOOL)hasPromptedForUserNotification { return [[NSUserDefaults standardUserDefaults] boolForKey:@"ABHasPromptedForUserNotification"]; } 

仅供参考:我发现最好在-[UIApplication application:didRegisterUserNotificationSettings:]设置"ABHasPromptedForUserNotification"为true,而不是在我调用时-[UIApplication registerForRemoteNotifications]因为在某些情况下用户可以多次显示提示。 如果用户为应用程序提供背景或接听电话,则可能会发生这种情况。 在这些情况下,提示将被iOS隐藏,如果下一次调用-[UIApplication registerForRemoteNotifications] ,则会再次显示。 在委托中设置此设置可以避免在用户被提示之前,在这些边缘情况下不会再提示用户。

没有

我相信这是故意的。 因为通常的情况是在每个应用程序启动时注册远程通知。 这意味着用户每次打开应用程序时都不应该看到权限对话框。 iOS自动执行此操作。 但是,如果您在请求权限之前显示额外的屏幕,则Apple不能让您知道用户是否过去拒绝了权限,因此您可以通过显示屏幕描述用户如何通过每次设置启用其权限。 这将撤消所有的苹果停止刺激用户。

在你的情况下,你必须遵循相同的策略。 在这两种情况下只显示一种说明屏幕,并在NSUserDefaults保存用户select,以确定是否不能再显示。 先前拒绝权限的用户将看不到权限对话框。 虽然你会为新用户带来一个好处(这显然是你正在努力实现的):如果用户取消了,你可能会多次显示说明屏幕。

如果您支持iOS 10及更高版本,则UNUserNotifications框架允许更多的粒度。

 let current = UNUserNotificationCenter.current() current.getNotificationSettings(completionHandler: { (settings) in if settings.authorizationStatus == .notDetermined { // Not requested } if settings.authorizationStatus == .denied { // User said Don't allow } })