是否可以区分
的情况我的情况:过去,我已经提示用户通知权限,但我从未跟踪过请求。后来,我停止尝试注册任何通知设置。现在,我想重新介绍用户通知。
在应用程序中发生重大事件后,我的计划是显示某种UI,以解释选择加入用户通知的好处。但是,如果用户已经拒绝,我更愿意展示一个可以将其带入Settings.app的单独用户界面。
目前,我使用-[UIApplication currentUserNotificationSettings]
来获取当前设置,但对于上述两种情况,它似乎都会返回UIUserNotificationTypeNone
。
答案 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以获得更多信息。