服务器重启后,移动端无法通过Firebase Cloud Messaging接收通知
解决FCM服务器重启后已注册设备收不到通知的问题
这种情况我之前排查过好几次,大概率是FCM的**设备注册令牌(Registration Token)**或者服务器端的订阅/配置状态在重启后出了问题,咱们一步步拆解原因和解决办法:
1. 服务器是否丢失了存储的设备令牌?
很多时候服务器会把设备令牌临时存在内存中(比如用变量缓存),一旦重启就会全部丢失——这时候哪怕推送流程没变,服务器手里根本没有有效的目标令牌,自然推不出去。
- 解决办法:把所有设备令牌持久化存储到数据库(比如MySQL、Firestore)里,服务器启动时从数据库加载令牌列表,而不是依赖内存缓存。
- 验证方式:检查服务器推送日志,看推送请求里携带的令牌是不是和客户端当前的令牌一致;如果日志里没有令牌,那肯定是存储环节出了问题。
2. 设备令牌是否已失效?
FCM令牌不是永久有效的,哪怕客户端没动,令牌也可能因为设备系统更新、应用签名变更、FCM服务器侧的令牌轮换而失效。服务器重启后如果还在使用旧的失效令牌,推送就会失败。
- 解决办法:
- 每次推送后检查FCM的响应,若收到
NotRegistered或InvalidRegistration错误码,立即从数据库中标记/删除该令牌。 - 在客户端实现令牌刷新监听(比如Android的
onNewToken方法、iOS的didRegisterForRemoteNotificationsWithDeviceToken),一旦令牌更新就主动发送给服务器替换旧令牌。
- 每次推送后检查FCM的响应,若收到
3. 服务器端FCM配置是否加载异常?
服务器重启后,FCM的认证信息(比如服务账号密钥JSON、API密钥)可能没正确加载,导致服务器没有权限向FCM发送推送请求。
- 解决办法:
- 检查服务器启动日志,看初始化FCM客户端时有没有认证失败的报错(比如“Invalid credentials”)。
- 确保FCM配置文件(如服务账号JSON)的路径正确,或者环境变量里的API密钥设置无误,重启时能被正常读取。
4. 快速排查步骤
如果还是找不到问题,可以按这个流程快速定位:
- 手动用客户端当前的有效令牌调用FCM的推送API(比如用Postman发送请求),看能不能收到通知——能收到的话,问题出在服务器的推送逻辑或令牌存储上;收不到的话,检查令牌是否真的有效。
- 对比服务器存储的令牌和客户端当前的令牌,确认两者完全一致(注意令牌是大小写敏感的)。
- 查看FCM控制台的推送报告,看有没有失败的推送记录,以及对应的失败原因。
内容的提问来源于stack exchange,提问作者Roni Koren Kurtberg
相关产品推荐
相关产品推荐

