Qt Android应用FCM令牌创建与刷新能否统一在C++层处理?
统一用C++层处理FCM令牌的创建与刷新
当然可以完全靠C层搞定FCM令牌的首次获取和刷新,不用再混用Java代码。你现在的问题根源在于同时配置了Java层的FirebaseInstanceIdService——它会抢占令牌刷新的回调,而实际上C的::firebase::messaging::Listener本身就支持处理刷新事件,只是被Java层截胡了而已。
下面是具体的解决步骤:
1. 移除Java层的相关代码与配置
- 删掉你写的继承自
FirebaseInstanceIdService的Java类 - 从
AndroidManifest.xml中移除对应的<service>配置项,彻底切断Java层对FCM令牌事件的监听
2. 确保C++ Listener的正确绑定与生命周期管理
要保证你的Listener子类实例在整个应用运行期间都有效,并且正确绑定到FCM的messaging实例上:
// 初始化Firebase App(建议在应用启动时只做一次) firebase::App* app = firebase::App::Create(firebase::AppOptions(), this); // 初始化Messaging模块,将你的Listener实例传入 firebase::messaging::Initialize(*app, this); // 注意:这里的`this`是你的Listener子类对象,一定要确保它不会被提前销毁(比如不要放在局部作用域)
3. 确认OnTokenReceived的作用范围
其实FCM的C++ SDK中,OnTokenReceived方法同时负责首次令牌生成和后续刷新的回调。之前因为Java层的存在,刷新事件被Java层接走了,现在移除Java代码后,当令牌刷新时,C++层的这个方法会被正常触发。
额外的小提示
- 尽量使用最新版本的Firebase C++ SDK,旧版本可能存在回调触发不及时的bug
- 应用启动时,可以主动调用
firebase::messaging::GetToken()来强制获取当前令牌,不用被动等待推送 - 一定要管理好Listener实例的生命周期,如果它在回调触发前被销毁,会导致崩溃或者无响应
内容的提问来源于stack exchange,提问作者mrAlmond
相关产品推荐
相关产品推荐

