registerUserNotificationSettings未触发代理,推送通知失效求助
排查远程推送注册回调不触发的问题
看起来你遇到了个挺棘手的差异问题——同一份代码在iPhone 6上正常跑,换到iPhone 11 Pro Max、XS Max、7这些机型就触发不了didRegisterForRemoteNotificationsWithDeviceToken和didFailToRegisterForRemoteNotificationsWithError这两个回调。结合你的代码和测试情况,我整理了几个针对性的排查方向和解决方案:
1. 重点排查iOS 13+的SceneDelegate影响
你的测试机型刚好划分成了两个梯队:iPhone 6最高只能升级到iOS 12,而出问题的几款都是iOS 13及以上的设备。这大概率是核心原因!
在iOS 13之后,苹果引入了SceneDelegate来管理多场景,原来AppDelegate里的部分推送相关回调会被转移到SceneDelegate中:
- 如果你的项目启用了SceneDelegate,那么
application(_:didRegisterForRemoteNotificationsWithDeviceToken:)和application(_:didFailToRegisterForRemoteNotificationsWithError:)不会再在AppDelegate里触发,需要把这两个方法复制到SceneDelegate.swift中实现。 - 另外,注册远程推送的代码,建议移到
SceneDelegate的scene(_:willConnectTo:options:)方法里执行,确保场景初始化完成后再请求推送权限。
2. 确认推送证书与设备环境匹配
虽然iPhone 6正常,但还是要核对证书配置细节:
- 检查你使用的推送证书是开发环境(Development)还是生产环境(Production),如果是开发证书,要确保出问题的那几款设备已经添加到开发者账号的设备列表中。
- 重新核对
GoogleService-Info.plist中的GCM_SENDER_ID、PROJECT_ID等字段,确保和Firebase控制台里的项目配置完全一致,避免配置文件不匹配导致推送链路中断。
3. 验证推送权限的实际获取状态
你的代码里权限请求的completionHandler是空的,建议加上日志输出,确认是否真的拿到了推送权限:
UNUserNotificationCenter.current().requestAuthorization( options: authOptions, completionHandler: { granted, error in print("推送权限获取状态:\(granted),错误信息:\(error?.localizedDescription ?? "无错误")") })
也可以手动去设备的「设置 -> 你的App -> 通知」里检查,是否开启了通知权限——如果权限没开,注册回调自然不会触发。
4. 检查AppDelegate的协议声明是否完整
确保你的AppDelegate正确遵循了所需的协议,比如:
@UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate, MessagingDelegate, UNUserNotificationCenterDelegate { // 你的代码逻辑 }
如果漏写了某个协议声明,代理方法会因为无法识别而不被调用。
5. 玄学但有效的缓存清理操作
有时候Xcode的缓存、设备推送服务的临时异常也会导致这类问题:
- 彻底关闭Xcode,清理Derived Data(路径:
Xcode -> Preferences -> Locations -> Derived Data,点击箭头删除文件夹) - 重启测试设备,然后重新编译运行项目
内容的提问来源于stack exchange,提问作者Onur Kundakçıoğlu
相关产品推荐
相关产品推荐

