是否需要实现didReceiveRegistrationToken?FCM认证用户通知疑问
关于FCM中
didReceiveRegistrationToken方法的必要性说明 你遇到的报错是Firebase Messaging SDK的强制要求——SDK会在多个场景下主动推送FCM token的更新,因此必须实现这个代理方法来接收这些更新。
为什么不能只靠登录时主动获取token?
你当前在登录时调用Messaging.messaging().token获取token同步到后端的逻辑,覆盖了用户主动登录的场景,但FCM的token更新还有很多你无法通过主动调用覆盖的场景:
- 应用首次安装启动,用户还未登录时,SDK可能已经生成了初始token
- FCM token会自动定期刷新(平台机制,无法手动控制)
- 设备环境变更(比如系统版本更新、安全密钥重置、应用权限变更)也会触发token更新
- 应用从备份恢复、卸载重装后,即使用户还没登录,SDK也可能生成新token
如果不实现didReceiveRegistrationToken方法,这些场景下的token更新你完全接收不到,一旦用户后续登录,后端存储的还是旧token,就会导致通知无法送达。
结合你的业务场景(仅向已认证用户发通知),该怎么实现这个方法?
你只需要在方法里判断用户的登录状态即可:
func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) { guard let token = fcmToken else { return } // 判断用户是否已登录 if UserAuthManager.isLoggedIn { // 同步新token到后端(覆盖旧token) updateFCMTokenToBackend(token: token) } else { // 未登录状态,可以暂时缓存token,等用户登录后再同步 UserDefaults.standard.set(token, forKey: "pendingFCMToken") // 或者直接忽略,等用户登录时再主动获取最新token } }
这样既满足了SDK的要求,又符合你“仅给已认证用户同步token”的业务逻辑。
你提供的代码与报错信息
登录时主动获取token的代码:
Messaging.messaging().token { token, error in // ... }
未实现代理方法时的报错:
9.5.0 - [FirebaseMessaging][I-FCM002023] The object <Name.Delegate: 0x2827c0650> does not respond to -messaging:didReceiveRegistrationToken:. Please implement -messaging:didReceiveRegistrationToken: to be provided with an FCM token.
内容的提问来源于stack exchange,提问作者Lukas
相关产品推荐
相关产品推荐

