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

iOS Axmol集成Firebase GMA C++ SDK时初始化Future一直Pending

解决Google Mobile Ads C++ SDK初始化永久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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 21:06:06