You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否需要实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 08:20:25