You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:19:02