GCM迁移至FCM:应用更新后无法触发onTokenRefresh获取新Token的问题
GCM迁移FCM后覆盖安装获取Token的解决方案
我之前处理过好几起GCM转FCM的迁移问题,这种覆盖安装时onTokenRefresh不触发的情况确实很常见——本质上是FCM检测到设备上已有可用的GCM兼容Token,不会主动触发刷新逻辑。下面是几个经过验证的可行方案:
1. 主动获取Token,不依赖被动回调
onTokenRefresh(或新版本的onNewToken)只有在Token首次创建、过期或被删除时才会触发,覆盖安装时旧Token仍有效,FCM不会主动触发回调。所以最稳妥的方式是在App启动阶段主动请求Token:
推荐在Application的onCreate方法中添加主动获取逻辑,同时结合本地存储避免重复上传:
@Override public void onCreate() { super.onCreate(); SharedPreferences prefs = getSharedPreferences("fcm_prefs", MODE_PRIVATE); String savedToken = prefs.getString("latest_fcm_token", ""); // 主动请求FCM Token FirebaseMessaging.getInstance().getToken() .addOnCompleteListener(task -> { if (!task.isSuccessful()) { Log.w("FCM_TOKEN", "获取Token失败", task.getException()); return; } String newToken = task.getResult(); // 对比本地存储,仅当Token变化时上传服务器 if (!newToken.equals(savedToken)) { uploadTokenToServer(newToken); prefs.edit().putString("latest_fcm_token", newToken).apply(); } }); }
2. 主动删除旧GCM Token,强制刷新
如果你需要确保获取的是纯FCM Token(而非GCM兼容Token),可以在首次覆盖安装时主动删除旧Token,触发新Token的生成:
SharedPreferences prefs = getSharedPreferences("app_migration", MODE_PRIVATE); boolean hasMigratedToFCM = prefs.getBoolean("migrated_to_fcm", false); if (!hasMigratedToFCM) { // 删除旧Token(兼容新旧FCM API) FirebaseMessaging.getInstance().deleteToken() .addOnCompleteListener(deleteTask -> { if (deleteTask.isSuccessful()) { // 标记已完成迁移,避免重复操作 prefs.edit().putBoolean("migrated_to_fcm", true).apply(); // 重新获取新Token FirebaseMessaging.getInstance().getToken().addOnCompleteListener(tokenTask -> { if (tokenTask.isSuccessful()) { String newToken = tokenTask.getResult(); uploadTokenToServer(newToken); } }); } }); }
⚠️ 注意:频繁调用deleteToken可能触发FCM的频率限制,所以一定要用本地标记控制执行次数。
3. 适配新版本FCM API
如果你的代码还在使用旧的FirebaseInstanceId类,建议升级到最新的FirebaseMessaging API:
- 旧版
onTokenRefresh已被弃用,替换为FirebaseMessagingService中的onNewToken方法 - 获取Token的方法从
FirebaseInstanceId.getInstance().getInstanceId()改为FirebaseMessaging.getInstance().getToken()
总结
最可靠的方案是主动获取Token+本地增量更新,完全依赖被动回调的话很容易漏掉覆盖安装的场景。结合本地存储还能减少不必要的服务器请求,优化性能。
内容的提问来源于stack exchange,提问作者MJM
相关产品推荐
相关产品推荐

