使用FirebaseMessaging、Installations替代FirebaseInstanceId的代码方案
代码逻辑说明
你对原有代码的4步逻辑理解完全正确,针对你存疑的两个概念解释如下:
Task:是Google Play服务体系提供的异步任务封装,专门处理不能阻塞主线程的耗时操作(比如和Firebase服务器交互拉取令牌的操作),支持绑定成功、失败、完成状态的回调,任务执行结束后会在主线程触发对应回调逻辑。instanceIdResult:是实例ID拉取任务成功后返回的结果对象,内部封装了当前App安装实例的唯一标识、对应的FCM推送令牌两类信息。
原有代码的实际运行逻辑:App启动后异步向Firebase服务端申请当前实例的FCM推送令牌,拿到令牌后调用语音通话SDK的注册接口,把当前设备的FCM令牌和用户账号绑定,这样后续有来电时,服务端可以通过FCM向当前设备推送来电邀请。
适配新版Firebase SDK的改写方案
废弃的FirebaseInstanceId获取令牌的能力已经全部迁移到FirebaseMessaging组件中,你不需要改动后续的注册逻辑,只需要替换获取令牌的入口即可,改写后可正常编译运行:
/* Register your FCM token to receive incoming call invites */ private void registerForCallInvites() { FirebaseMessaging.getInstance().getToken() .addOnSuccessListener(this, fcmToken -> { Log.i(TAG, "Registering with FCM"); Voice.register(accessToken, Voice.RegistrationChannel.FCM, fcmToken, registrationListener); }) .addOnFailureListener(e -> Log.e(TAG, "FCM token fetch failed", e)); }
额外注意事项
- 请确保模块级
build.gradle中引入了维护中的Firebase Messaging依赖,移除已经废弃的firebase-iid单独依赖。 - FCM令牌不是永久有效的,会在App重装、清除数据、令牌过期、Firebase主动刷新时发生变更,你需要自定义继承
FirebaseMessagingService的服务,重写onNewToken方法,在拿到新令牌时重新执行上述注册逻辑,避免令牌失效后收不到来电推送。
内容的提问来源于stack exchange,提问作者D-I-S-C
相关产品推荐
相关产品推荐

