Capacitor JS打包React安卓应用后Firebase FCM token频繁过期如何解决
问题原因
你遇到的FirebaseMessagingError: Requested entity was not found错误本质是服务端存储的FCM设备token已失效,Firebase已不再识别该token。FCM token并非永久有效,会在以下场景自动更新:
- Firebase服务定期轮换token(常规周期为几周,也可能因平台策略提前触发)
- 用户清除应用存储数据、卸载重装应用
- 应用恢复备份到新设备
- 安卓系统版本升级、应用进程被强制清理后缓存异常
解决方案
1. 补充监听token自动刷新事件
除了应用启动时主动获取token外,Capacitor PushNotifications插件的registration事件会在FCM token自动刷新时自动触发,只要应用进程没被系统完全杀死,不需要用户主动打开应用也能捕获。你需要将这个触发的新token实时同步到服务端数据库,覆盖旧token即可:
// 原有注册监听逻辑保留,新增服务端同步逻辑,不要仅做弹窗提示 PushNotifications.addListener('registration', (token: Token) => { // 调用自己的服务端接口,更新对应用户绑定的token fetch('你的服务端token更新接口地址', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ userId: 当前登录用户的唯一标识, newToken: token.value }) }) } ); // 补充注册失败监听,异常时可以触发重试逻辑 PushNotifications.addListener('registrationError', (error) => { console.log('推送注册失败: ', error); // 可在此加延迟重试逻辑 })
2. 服务端新增失效token清理逻辑
当你调用Firebase推送接口返回Requested entity was not found错误时,直接将本次请求使用的token从数据库中删除或标记为失效,避免后续重复发送无效请求。
注意:如果你的应用支持同一账号多设备登录,不要直接删除账号下所有token,仅删除当前返回错误的对应token即可。
3. 补充冷启动时的token校验逻辑
每次应用冷启动时,主动调用Capacitor的getRegistrationToken方法获取当前最新token,和本地缓存的历史token对比,如果不一致就立即同步到服务端:
// 应用初始化阶段执行 const latestToken = await PushNotifications.getRegistrationToken(); const localCachedToken = localStorage.getItem('fcm_token'); if (latestToken.value !== localCachedToken) { await updateTokenToServer(latestToken.value); // 调用你自己的服务端更新接口 localStorage.setItem('fcm_token', latestToken.value); }
4. 低频次打开用户适配
如果有用户长时间不打开应用,token已失效且没触发刷新同步的情况,可以在推送失败后给对应用户账号加个标记,等用户下次打开应用时主动触发一次业务提示,引导用户确认通知权限后重新完成token注册流程。
内容的提问来源于stack exchange,提问作者Sandeep Gupta
相关产品推荐
相关产品推荐

