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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 06:27:03