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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 16:39:33