iOS推送通知:调用UNUserNotificationCenter请求授权未通过的原因
granted 一直返回 false? 我来帮你梳理下可能导致这个问题的常见原因,一个个排查应该能找到根源:
用户已经手动关闭/拒绝过权限
这是最大概率的情况。如果用户之前在系统设置里(「设置」→ 你的App →「通知」)关掉了通知权限,或者第一次弹出授权弹窗时选了「不允许」,那后续调用requestAuthorization不会再弹授权框,直接返回granted = false。先去设置里确认下App的通知权限状态吧。Info.plist 缺少关键配置
虽然iOS 10+用UNUserNotificationCenter管理通知,但如果你的App需要接收远程推送,必须在Info.plist里配置UIBackgroundModes并添加remote-notification项。要是没加这个,可能会干扰权限申请的逻辑(尤其是涉及远程推送时)。另外,确保没有旧的通知配置(比如iOS 9及以前的UIUserNotificationSettings相关设置)和新配置冲突。授权请求时机太早
要是在App启动的极早期(比如application:didFinishLaunchingWithOptions:还没执行完,或者App还没完全初始化)就调用授权请求,系统可能还没准备好处理,直接返回false。建议把授权请求放在用户主动触发的操作里(比如点击「开启通知提醒」按钮),或者等App启动完成后延迟几秒再调用。模拟器的缓存或兼容性问题
模拟器有时候会出现权限状态缓存的情况,或者本身对某些推送功能支持有限。试试换真实设备测试,或者重置模拟器的内容和设置后再重新运行App测试。多次拒绝后系统自动屏蔽请求
如果用户多次拒绝授权弹窗,iOS系统会自动不再弹出授权框,直接返回false。这种情况下,你需要在App里引导用户去系统设置手动开启权限,而不是继续调用requestAuthorization。检查回调里的
error参数
别忽略回调里的error参数!如果error不为空,里面的错误信息会直接告诉你问题所在——比如权限被系统限制、配置错误等。另外,确保你调用的是UNUserNotificationCenter.current(),没有误创建其他实例导致请求无效。
内容的提问来源于stack exchange,提问作者Questioner

