关于Firebase Messaging令牌获取与onNewToken回调的困惑求解
FCM主动获取令牌与监听onNewToken()的场景区别
我们可以通过以下代码主动获取当前FCM令牌:
FirebaseMessaging.getInstance().getToken() .addOnCompleteListener(new OnCompleteListener<String>() { @Override public void onComplete(@NonNull Task<String> task) { if (!task.isSuccessful()) { Log.w(TAG, "Fetching FCM registration token failed", task.getException()); return; } // 获取新的FCM注册令牌 String token = task.getResult(); // 日志打印与Toast提示 String msg = getString(R.string.msg_token_fmt, token); Log.d(TAG, msg); Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show(); } });
而Firebase要求注册服务监听onNewToken()回调,触发场景包括:
- 应用首次启动生成新令牌时
- 已有令牌发生变更时,具体包括:
- 应用被恢复到新设备
- 用户卸载后重装应用
- 用户清除应用数据
为什么需要监听回调?主动获取不够吗?
虽然应用会话内令牌不会变更,但令牌变更的场景大多发生在会话之外,主动获取覆盖不到这些情况:
主动调用getToken()的适用场景
- 应用启动时需要立即拿到令牌,比如首次启动后马上上报给服务器
- 用户手动开启推送权限后,需要主动拉取并同步令牌
- 测试或排查推送问题时,主动获取当前令牌验证
onNewToken()回调的不可替代性
- 当用户把应用迁移到新设备、卸载重装或清除数据后,新令牌生成时,若用户没有触发主动获取的逻辑(比如只是后台启动应用),你无法通过主动调用拿到新令牌,导致服务器存储的旧令牌失效,推送失败
- 首次启动时,若主动获取因网络问题失败,回调能兜底确保你拿到令牌
- 令牌变更属于被动事件,你无法预知何时发生,监听回调是唯一能实时捕获这些变更的方式
总结
两者是互补关系:
- 主动获取是按需拉取,适合需要立即获取令牌的场景
onNewToken()是被动监听,确保你不会遗漏任何令牌变更,保证服务器上的令牌始终有效,避免推送失败
内容的提问来源于stack exchange,提问作者Naruto26
相关产品推荐
相关产品推荐

