iOS 14中UNUserNotificationCenter请求授权失败,无权限弹窗显示
解决iOS 14中通知权限请求不弹窗直接失败的问题
看起来你在iOS 14上遇到了通知权限请求的棘手问题——权限弹窗完全不出现,直接返回错误码1。结合你的描述(iOS13正常,iOS14失败),我来帮你分析几个最可能的原因和对应的解决办法:
1. 用户已永久拒绝通知权限,系统不再弹窗请求
这是最常见的原因。在iOS 14中,如果用户曾经手动拒绝过你的app的通知权限,或者通过系统设置关闭了通知权限,后续再调用requestAuthorizationWithOptions:时,系统不会再弹出权限请求弹窗,而是直接返回granted=NO和错误码1。
验证方法:
- 打开设备的「设置」→ 找到你的应用「My App」→ 查看「通知」选项是否被设置为「关闭」状态。
解决办法:
- 在回调中检测到权限被拒绝时,引导用户前往设置页面开启权限。可以用以下代码跳转:
if (!granted && error.code == 1) { UIApplication *application = [UIApplication sharedApplication]; NSURL *settingsURL = [NSURL URLWithString:UIApplicationOpenSettingsURLString]; if ([application canOpenURL:settingsURL]) { [application openURL:settingsURL options:@{} completionHandler:nil]; } }
2. 应用的Info.plist缺少必要的权限描述键
虽然你的代码在iOS13上正常,但也有可能是Info.plist中的通知权限描述出现了问题(比如被误删或者格式错误)。iOS要求必须在Info.plist中添加NSUserNotificationUsageDescription键,用来向用户说明请求通知权限的用途,否则权限请求可能会失败。
检查方法:
- 打开Info.plist,确认是否存在
NSUserNotificationUsageDescription键,并且其值是清晰易懂的描述文本(比如"我们需要通知权限来向您推送订单状态更新")。
3. 测试设备的全局通知设置被禁用
这种情况比较少见,但也可以排查:
- 打开设备的「设置」→「通知」→ 确认「允许通知」的全局开关是否处于开启状态。如果这个开关被关闭,所有app的通知权限都会被禁用。
额外提醒
在iOS 14中,苹果对权限请求的逻辑做了更严格的限制,一旦用户拒绝了某个权限,除非用户手动在设置中更改,否则app无法再次触发权限请求弹窗。所以在请求权限前,最好先检查当前的权限状态,避免不必要的失败回调:
[[UNUserNotificationCenter currentNotificationCenter] getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings *settings) { if (settings.authorizationStatus == UNAuthorizationStatusNotDetermined) { // 还未请求过权限,发起请求 UNAuthorizationOptions authOptions = UNAuthorizationOptionAlert | UNAuthorizationOptionSound | UNAuthorizationOptionBadge; [[UNUserNotificationCenter currentNotificationCenter] requestAuthorizationWithOptions:authOptions completionHandler:^(BOOL granted, NSError * _Nullable error) { NSLog(@"%i %@",granted, error); // 处理权限结果 }]; } else if (settings.authorizationStatus == UNAuthorizationStatusDenied) { // 权限已被拒绝,引导用户去设置开启 // 这里可以弹出提示框告知用户 } }];
这样先检查权限状态,再决定是否发起请求,会让流程更合理,也能避免出现你遇到的直接失败的情况。
内容的提问来源于stack exchange,提问作者user3570727
相关产品推荐
相关产品推荐

