推送通知无法获取Token:didRegister等回调方法未触发求助
didRegisterForRemoteNotificationsWithDeviceToken不调用的问题 我之前在集成iOS推送的时候也完完全全踩过这个坑!控制台只刷权限相关的日志,但就是不触发注册成功或失败的回调,折腾了好几天才把所有坑趟平,给你列几个最容易忽略的排查点:
权限请求和注册的顺序绝对不能搞反
你得先请求用户的通知权限,等用户明确授权之后再调用注册远程通知的方法。正确的流程应该是这样:// 先发起权限请求 UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { granted, error in if granted { // 权限通过后,回到主线程注册远程通知 DispatchQueue.main.async { UIApplication.shared.registerForRemoteNotifications() } } }很多人会把
registerForRemoteNotifications()放在权限请求外面,或者没等用户授权就执行,这时候系统根本不会去请求设备Token。必须用真机测试,模拟器大概率不靠谱
模拟器有时候能模拟权限弹窗,但几乎不会返回真实的Device Token——哪怕你配置了推送证书也没用。拿一台登录了Apple ID的真机,还要确保你的开发者账号已经把这台设备添加到了设备列表里。检查Xcode的Capabilities配置
打开项目Target的Signing & Capabilities标签:- 确认已经添加了
Push Notifications能力,开关处于打开状态 - 确认Signing配置里的Team是正确的开发者账号,对应的证书包含推送权限(可以去苹果开发者后台检查推送证书是否有效)
- 确认已经添加了
验证通知权限是否真的被授予
控制台打印的“Permission...”可能只是告诉你发起了权限请求,但用户不一定点了允许。你可以手动调用API检查当前权限状态:UNUserNotificationCenter.current().getNotificationSettings { settings in print("当前通知权限状态:\(settings.authorizationStatus)") }如果状态是
.denied,就得去系统设置里给APP开启通知权限;如果是.notDetermined,说明权限请求流程有问题,用户还没做出选择。Delegate设置是否正确
确保你在合适的时机设置了通知中心的Delegate,比如在AppDelegate的didFinishLaunchingWithOptions里:UNUserNotificationCenter.current().delegate = self另外,
didRegisterForRemoteNotificationsWithDeviceToken是UIApplicationDelegate的方法,如果你用的是SceneDelegate,也要确保AppDelegate里实现了这个方法,或者在SceneDelegate的sceneWillEnterForeground里重新注册一次远程通知。检查系统版本和特殊场景
iOS 13及以上版本,APP切换到后台再回到前台时,可能需要重新注册远程通知;如果你的APP是通过推送唤醒的,也要确保注册逻辑在唤醒后能正常执行。
如果以上所有点都排查过还是不行,建议去苹果开发者后台重新生成推送证书,然后重新下载安装到Xcode——有时候证书的缓存会莫名其妙出问题。
内容的提问来源于stack exchange,提问作者Lio

