iOS Axmol集成Firebase GMA C++ SDK时初始化Future一直Pending
针对你在iOS平台Axmol应用中遇到的GMA C++ SDK初始化future始终Pending的问题,可尝试以下排查和修复步骤:
1. 避免Firebase App重复初始化
你在AppController.mm中调用了[FIRApp configure](ObjC层初始化),又在AppDelegate.cpp中调用firebase::App::Create()(C++层初始化),这会导致Firebase实例冲突,进而阻塞异步初始化流程。
修复方案:保留ObjC层的初始化,C++层直接获取已存在的实例:
// AppDelegate.cpp中替换原Create()代码 firebase::App* app = firebase::App::GetInstance(); if (!app) { // 处理实例获取失败逻辑 return false; }
2. 移除主线程阻塞的while循环
你当前在applicationDidFinishLaunching中用while循环阻塞主线程等待初始化完成,这会导致iOS系统无法分发Firebase所需的异步回调事件,进而让future一直处于Pending状态。
修复方案:将初始化状态检查移至Axmol的游戏循环中(比如update回调):
// 在AppDelegate类中保存future对象作为成员变量 firebase::Future<firebase::gma::AdapterInitializationStatus> _gmaInitFuture; // applicationDidFinishLaunching中初始化代码 firebase::InitResult result; _gmaInitFuture = firebase::gma::Initialize(*app, &result); if (result != firebase::kInitResultSuccess) { // 处理初始化错误 } // 重写update方法(若未实现) void AppDelegate::update(float dt) { if (_gmaInitFuture.status() != firebase::kFutureStatusPending) { if (_gmaInitFuture.error() == firebase::kErrorNone) { // GMA初始化成功,执行后续广告加载逻辑 } else { // 处理初始化失败,打印错误信息 CC_LOG_ERROR("GMA初始化失败: %s", _gmaInitFuture.error_message()); } // 重置future避免重复处理 _gmaInitFuture = firebase::Future<firebase::gma::AdapterInitializationStatus>(); } }
也可以使用回调监听完成事件:
firebase::gma::InitializeLastResult().OnCompletion([](const firebase::Future<firebase::gma::AdapterInitializationStatus>& future) { if (future.status() == firebase::kFutureStatusComplete) { if (future.error() == firebase::kErrorNone) { CC_LOG_DEBUG("GMA初始化成功"); } else { CC_LOG_ERROR("GMA初始化失败: %s", future.error_message()); } } });
3. 确保Firebase依赖版本匹配
Firebase C++ SDK 11.9.0需要对应版本的iOS原生SDK,若CocoaPods中的依赖版本不匹配,会引发兼容性问题。
修复方案:在Podfile中明确指定版本:
pod 'Firebase/CoreOnly', '11.9.0' pod 'Google-Mobile-Ads-SDK', '11.9.0' # 需确认与C++ SDK兼容的版本,可参考Firebase官方版本对照表 pod 'GoogleUserMessagingPlatform',对应兼容版本
执行pod install --repo-update更新依赖。
4. 检查ProcessEvents逻辑
若你自定义的ProcessEvents函数未正确处理Firebase的后台事件,会导致异步任务无法推进。确保函数中包含Firebase的事件处理:
bool ProcessEvents(int timeout_ms) { // 原有的Axmol/Cocos2d-x事件处理逻辑 // 添加Firebase事件处理 firebase::App::ProcessEvents(); // 返回是否有事件处理的标志 }
5. 启用调试日志排查隐藏错误
开启Firebase详细日志,查看初始化过程中的隐藏错误:
// 在AppDelegate.cpp初始化前添加 firebase::SetLoggerLevel(firebase::kLoggerLevelVerbose);
同时在AppController.mm中添加ObjC层日志:
[FIRConfiguration sharedConfiguration].logLevel = FIRLoggerLevelVerbose;
运行应用后查看Xcode控制台输出,定位是否有初始化相关的错误信息。
6. 验证配置文件完整性
- 确认
GoogleService-Info.plist已正确添加到项目,且Target Membership已勾选当前应用Target; - 检查
Info.plist中的GADApplicationIdentifier是否与Firebase控制台中的AdMob应用ID完全一致; - 确认应用的Bundle ID与Firebase项目中注册的Bundle ID匹配。
内容的提问来源于stack exchange,提问作者FHBlah

