获取对应Sender ID的FCM Token提示APNS device token未设置如何解决
报错诱因
- 核心是执行时序问题:你当前在
didFinishLaunchingWithOptions中的代码顺序是先配置Firebase、再注册通知权限、最后设置Messaging代理。FCM在检测到Messaging代理被设置后会立刻尝试拉取FCM token,但此时APNs的device token还未返回(用户同意通知权限、系统返回APNs token是异步操作,执行时机晚于代理设置),就会触发该报错。 - 两次返回token的现象对应两次生成的FCM token:第一次是未绑定APNs的无效token,第二次是APNs token上传到FCM后自动刷新生成的有效token。
修复方案
- 调整启动阶段的代码执行顺序,先完成通知注册,再配置Firebase和设置Messaging代理:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // 先执行通知注册逻辑 self.registerForFirebaseNotification(application: application) // 再配置Firebase、设置代理 FirebaseApp.configure() Messaging.messaging().delegate = self return true }
- 新增无效token过滤逻辑,避免把未绑定APNs的无效token上传到业务服务端:
func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) { // 仅保留APNs token已设置后生成的有效FCM token guard let fcmToken = fcmToken, Messaging.messaging().apnsToken != nil else { return } self.firebaseToken = fcmToken print("Firebase token: \(fcmToken)") // 此处再执行token上传到业务服务端的逻辑 }
- 额外排查项:
- 必须使用真机调试,模拟器无法获取APNs token会固定触发该报错
- 确认Xcode的
Signing & Capabilities中已经添加Push Notifications权限,以及Background Modes下的Remote notifications勾选 - 若用户拒绝了通知权限,系统不会返回APNs token,也会触发该报错,可根据业务场景处理无通知权限的逻辑
内容的提问来源于stack exchange,提问作者david vargas
相关产品推荐
相关产品推荐

