GCM迁移FCM后生产构建无法触发onTokenRefresh()获取token求助
解决FCM生产签名后onTokenRefresh()不触发的问题
我之前帮不少开发者排查过类似的GCM转FCM的适配问题,结合你提到的「调试版正常、生产签名后失效」的情况,且你已经完成了SHA1、包名、App ID的基础配置,给你几个针对性的排查和解决方向:
1. 确认Firebase配置的SHA1是生产环境实际生效的签名指纹
很多人在这里踩了坑:如果你的应用通过Google Play App Signing发布,那Firebase控制台需要添加的不是你本地keystore的SHA1,而是Google Play后台「应用签名」页面里显示的上传密钥或应用签名密钥的SHA1。
- 操作步骤:打开Google Play Console → 你的应用 → 发布 → 应用签名 → 复制对应指纹,添加到Firebase控制台的项目设置中,再重新下载
google-services.json替换到项目里。
2. 不要被动依赖onTokenRefresh(),主动触发Token获取
onTokenRefresh()仅在Token首次生成、旧Token失效/更新时才会被调用,生产环境可能因系统缓存或限制不会主动触发回调。建议在应用启动阶段主动调用获取Token的方法:
// Firebase Messaging 21.0.0及以上版本推荐写法 FirebaseMessaging.getInstance().getToken() .addOnCompleteListener(new OnCompleteListener<String>() { @Override public void onComplete(@NonNull Task<String> task) { if (!task.isSuccessful()) { Log.w(TAG, "获取Token失败", task.getException()); return; } // 获取到的有效Token String token = task.getResult(); // 这里处理Token上传至服务器等逻辑 } });
3. 清除生产应用的缓存数据,重新测试
生产环境安装的应用可能残留了旧的GCM/FCM缓存,导致Token生成逻辑异常。可以尝试:
- 完全卸载应用后重新安装生产签名包
- 进入应用设置,清除缓存和数据后重启应用
4. 检查生产编译的依赖与混淆配置
确保生产build的配置没有影响FCM的正常工作:
- 确认
google-services.json已正确替换到生产环境的资源目录 - 在混淆规则文件(proguard-rules.pro)中添加FCM的保护规则:
-keep class com.google.firebase.** { *; } -keep class com.google.android.gms.** { *; } -dontwarn com.google.firebase.**
内容的提问来源于stack exchange,提问作者Kirill Kulakov
相关产品推荐
相关产品推荐

