应用无法接收推送通知且出现Firebase FCM token注销失败报错如何解决?
问题原因
这个messaging/token-unsubscribe-failed报错以及404响应是以下几种常见原因导致的:
- 本地存储的FCM注册令牌已经过期、失效,或者已经被Firebase服务端删除,SDK尝试用该旧令牌执行取消订阅、刷新令牌操作时,服务端找不到对应记录返回404
- Firebase项目的Cloud Messaging服务器密钥被重置,或项目本身被删除,旧令牌全部失效
- 用户清除了应用的浏览器缓存/本地存储,或是卸载重装过应用,本地残留的旧令牌与服务端记录不匹配
- 前端初始化Firebase的配置参数和Firebase控制台的项目配置不一致,导致SDK请求时找不到对应资源
修复方案
- 主动捕获无效令牌错误,强制刷新令牌
代码中增加messaging/token-unsubscribe-failed错误的捕获逻辑,出现该错误时直接清理本地存储的所有FCM相关缓存(包括localStorage、IndexedDB中存储的令牌、订阅记录),再重新申请新的FCM令牌,示例代码如下:import { getMessaging, getToken, deleteToken } from "firebase/messaging"; const messaging = getMessaging(); async function refreshFCMToken() { try { await deleteToken(messaging); } catch (err) { if (err.code === 'messaging/token-unsubscribe-failed') { // 清除本地存储的旧令牌 localStorage.removeItem('fcm_token'); // 若令牌存储在IndexedDB中,对应增加删除逻辑 } } // 重新申请新令牌 const newToken = await getToken(messaging, { vapidKey: '你的VAPID公钥' }); // 将新令牌同步到自有服务端存储 await fetch('/api/save-fcm-token', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ token: newToken }) }); } - 核对Firebase初始化配置
检查前端初始化Firebase时用到的apiKey、projectId、messagingSenderId三个参数,确保和Firebase控制台项目设置页给出的配置完全一致,不要使用旧项目的配置参数。 - 优化服务端令牌管理逻辑
自有后端调用FCM接口发送通知时,如果返回InvalidRegistration或NotFound错误,直接删除数据库中存储的对应无效令牌,避免后续重复发起无效请求。 - 验证修复效果
清除浏览器缓存后重新打开应用,触发新令牌申请流程,再测试推送发送,确认无控制台报错且应用可正常接收通知。
内容的提问来源于stack exchange,提问作者Akash Kakkar
相关产品推荐
相关产品推荐

