FCM报错messaging/registration-token-not-registered,但客户端仍用该令牌
解决FCM令牌“未注册”但客户端仍返回同一令牌的问题
问题原因
FCM返回messaging/registration-token-not-registered错误,说明该令牌在FCM服务器端已被标记为无效,但客户端调用getToken()时优先返回本地缓存的旧令牌,不会主动校验令牌在FCM侧的有效性。常见触发场景包括:
- 用户卸载重装APP后,本地缓存的旧令牌未被清理,但FCM已注销该令牌
- 设备Google服务组件更新,导致令牌失效但客户端未感知
- APP被系统清除数据后,本地缓存令牌残留,但FCM端已失效
解决步骤
- 强制客户端获取新令牌:不要直接依赖
getToken()的缓存结果,先调用deleteToken()清除本地缓存,再重新获取新令牌。代码示例:// 先清除旧令牌缓存 await getMessaging().deleteToken(); // 获取新令牌 const newToken = await getMessaging().getToken(); // 将新令牌同步到后端数据库 - 后端及时清理无效令牌:收到
messaging/registration-token-not-registered错误时,立即将对应的令牌从数据库中移除,避免后续重复发送无效请求。 - 监听客户端令牌刷新事件:在客户端注册
onTokenRefresh监听,一旦FCM自动刷新令牌,就把新令牌同步到后端,从根源减少无效令牌的产生:getMessaging().onTokenRefresh(() => { getMessaging().getToken().then(newToken => { // 同步新令牌到后端 }); });
内容的提问来源于stack exchange,提问作者esafresa
相关产品推荐
相关产品推荐

