FirebaseMessaging.getToken()不返回令牌报TOO_MANY_REGISTRATIONS错误
Android FCM推送单设备无法获取令牌问题排查
现有实现配置
Manifest清单配置
<service android:name=".MyFirebaseMessagingService" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>
消息接收服务实现
public class MyFirebaseMessagingService extends FirebaseMessagingService { @Override public void onNewToken(@NonNull String s) { super.onNewToken(s); // 令牌上报服务端逻辑 } // 其余推送处理逻辑 }
主动拉取令牌逻辑
FirebaseMessaging.getInstance().getToken().addOnCompleteListener(task -> { if (task.isSuccessful()) { // 令牌上报服务端逻辑 } });
问题现象
- 所有测试设备推送链路运行正常
- 1台Pixel 4a设备用户反馈无法收到任何推送,查询服务端数据库确认该设备从未上报过FCM令牌
- 该设备可正常接收其他应用的推送,排除Google服务缺失、网络不通等基础故障
- 补充异常捕获后,拿到令牌获取失败的错误信息:
TOO_MANY_REGISTRATIONS
问题根因
TOO_MANY_REGISTRATIONS是FCM服务端返回的标准限流错误,代表当前设备的FCM注册数触达上限:FCM对单台设备可注册的不同Sender ID(对应不同Firebase项目、不同接入推送的应用)有数量阈值,默认约为100个,超过阈值后新的注册请求会被直接拒绝。
常见触发场景包括:
- 设备安装了大量使用不同Firebase项目推送的应用,占满了注册配额,这类情况常出现在安装较多测试包、小众应用的用户设备上
- 应用自身逻辑存在缺陷,短时间内反复触发令牌注册:比如每次冷启动无理由调用
deleteToken()后重新申请令牌、多进程并发触发注册逻辑,产生大量无效注册记录触发限流 - 设备上Google Play服务缓存数据异常,注册计数统计出错,误判达到配额上限
修复方案
- 补全令牌获取的异常处理逻辑:捕获
TOO_MANY_REGISTRATIONS等异常后,采用指数退避策略重试,初始重试间隔设为1小时,后续逐步拉长间隔,禁止短时间高频重试避免被加重限流。 - 优化令牌注册、上报逻辑:本地持久化存储最近一次上报成功的令牌,仅当新获取的令牌和本地存储值不一致、或本地无有效令牌时才触发服务端上报;非必要不主动调用
deleteToken()接口,避免产生无效注册请求。 - 针对出现问题的用户,可引导执行以下操作恢复:
- 进入系统设置-应用-所有应用-Google Play服务-存储与缓存,点击清除缓存后重启设备,再重新打开应用尝试获取令牌
- 若清除缓存无效,可移除设备上登录的多余Google账号后重新添加,重置FCM本地注册计数
- 增加令牌获取失败的埋点上报,统计各类错误的出现占比,避免同类问题大面积出现时无感知。
内容的提问来源于stack exchange,提问作者Sujith S Manjavana
相关产品推荐
相关产品推荐

