iOS推送通知设置 - 拒绝权限与权限从未请求

时间:2015-02-28 17:43:45

标签: ios push-notification apple-push-notifications ios-permissions

是否可以区分

的情况
  1. iOS用户已明确拒绝用户通知权限,
  2. 从未提示过iOS用户的权限?
  3. 我的情况:过去,我已经提示用户通知权限,但我从未跟踪过请求。后来,我停止尝试注册任何通知设置。现在,我想重新介绍用户通知。

    在应用程序中发生重大事件后,我的计划是显示某种UI,以解释选择加入用户通知的好处。但是,如果用户已经拒绝,我更愿意展示一个可以将其带入Settings.app的单独用户界面。

    目前,我使用-[UIApplication currentUserNotificationSettings]来获取当前设置,但对于上述两种情况,它似乎都会返回UIUserNotificationTypeNone

5 个答案:

答案 0 :(得分:24)

就我个人而言,我还没有找到通过快速查询iOS SDK来确定这一点的方法。

然而,当调用-[UIApplication application:didRegisterUserNotificationSettings:]时,我能够自己跟踪记录。

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

如果发生这种情况,您可以稍后检查此值以确定是否先前已显示提示。

示例代码:

- (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"];
}

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

答案 1 :(得分:2)

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

在您的情况下,您必须遵循相同的策略。在两种方案中仅显示一种类型的解释性屏幕,并在NSUserDefaults中保存用户选择以了解您是否必须再次显示它。拒绝权限的用户不会看到权限对话框。虽然你会为新用户带来一个好处(显然你正在努力实现):如果用户取消了,你可能会多次显示解释性屏幕。

答案 2 :(得分:1)

如果您支持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
    }
})

答案 3 :(得分:0)

如果有人需要检查旧的UIUserNotification API以获取访问权限。以下代码经过试用和测试。

- (BOOL)isUserNotificationAllowed {
    UIUserNotificationType types = [[UIApplication sharedApplication] currentUserNotificationSettings].types;
    if(types & UIUserNotificationTypeBadge || types & UIUserNotificationTypeSound || types & UIUserNotificationTypeAlert){
        return YES;
    }
    else {
        return NO;
    }
}

答案 4 :(得分:0)

针对iOS 10.0+的更新。
Apple提供此功能来检查用户的推送通知权限状态:

[[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
switch (settings.authorizationStatus) {
  case UNAuthorizationStatusNotDetermined:
    DDLogDebug(@"Not Determined");
    break;
  case UNAuthorizationStatusDenied:
    DDLogDebug(@"Denied");
    break;
  case UNAuthorizationStatusAuthorized:
    DDLogDebug(@"Authorized");
    break;
  case UNAuthorizationStatusProvisional:
    DDLogDebug(@"Provisional");
    break;
}
}];

检查Apple Doc以获得更多信息。