Cocos Creator 2.x 游戏接入 Google AdMob 广告避坑全记录:从手动集成SDK到iOS上架
2026/6/5 8:41:17 网站建设 项目流程

Cocos Creator 2.x游戏手动集成Google AdMob广告SDK实战指南

作为独立游戏开发者,在Cocos Creator 2.x项目中手动集成Google AdMob广告SDK时,往往会遇到各种意想不到的"坑"。本文将基于真实项目经验,从SDK下载到最终上架App Store的全流程,为你剖析那些官方文档没写清楚的细节问题。

1. 环境准备与基础配置

在开始集成前,确保你的开发环境满足以下条件:

  • Cocos Creator 2.4.3或更高版本
  • Xcode 12.0+(推荐使用最新稳定版)
  • macOS Big Sur 11.5+
  • 有效的Google AdMob账号

关键配置步骤:

  1. 在Xcode项目中创建Frameworks文件夹,用于存放手动集成的SDK
  2. 下载最新版Google Mobile Ads SDK(当前为8.9.0)
  3. 将以下7个必需框架拖入项目:
    • GoogleMobileAds.framework
    • GoogleAppMeasurement.framework
    • GoogleUtilities.framework
    • nanopb.framework
    • PromisesObjC.framework
    • UserMessagingPlatform.framework(欧盟合规必需)

注意:务必勾选"Copy items if needed"选项,否则会导致编译时找不到框架引用

2. 链接器与Info.plist关键配置

手动集成最容易出问题的环节就是链接器设置和Info.plist配置。以下是必须检查的核心项:

2.1 链接器标记设置

在Xcode的Build Settings中,找到"Other Linker Flags",确保包含:

-ObjC $(inherited)

常见问题:

  • 如果遇到Undefined symbols错误,通常是因为缺少-ObjC标记
  • 某些Cocos Creator模板项目可能默认不包含这些标记

2.2 Info.plist必备条目

在Info.plist中添加以下键值对:

Key类型值示例说明
NSUserTrackingUsageDescriptionString"此标识符将用于向您提供更相关的广告"iOS 14+追踪权限描述
GADApplicationIdentifierString"ca-app-pub-xxxxxxxx~yyyyyyyy"你的AdMob应用ID
GADIsAdManagerAppBooleantrue解决某些广告加载问题
GADDelayAppMeasurementInitBooleantrue欧盟地区合规延迟初始化

实际配置示例:

<key>NSUserTrackingUsageDescription</key> <string>您的数据将用于提供更好的个性化广告体验</string> <key>GADApplicationIdentifier</key> <string>ca-app-pub-3940256099942544~1458002511</string> <key>GADIsAdManagerApp</key> <true/> <key>GADDelayAppMeasurementInit</key> <true/>

3. 广告模块的Objective-C实现

手动集成需要自行封装广告展示逻辑。以下是三种常见广告类型的核心实现:

3.1 横幅广告(Banner)实现

创建AdsBanner类处理横幅广告逻辑:

// AdsBanner.h #import <GoogleMobileAds/GoogleMobileAds.h> @interface AdsBanner : NSObject <GADBannerViewDelegate> - (void)loadBannerAd:(UIViewController *)parentVC; @end // AdsBanner.m @implementation AdsBanner { GADBannerView *_bannerView; } - (void)loadBannerAd:(UIViewController *)parentVC { _bannerView = [[GADBannerView alloc] initWithAdSize:kGADAdSizeBanner]; _bannerView.adUnitID = @"ca-app-pub-3940256099942544/2934735716"; _bannerView.rootViewController = parentVC; _bannerView.delegate = self; [_bannerView loadRequest:[GADRequest request]]; } // 实现GADBannerViewDelegate协议方法... @end

3.2 插页广告(Interstitial)实现

// AdsInterstitial.h @interface AdsInterstitial : NSObject <GADFullScreenContentDelegate> - (void)loadInterstitial; - (void)showInterstitial:(UIViewController *)parentVC; @end // AdsInterstitial.m @implementation AdsInterstitial { GADInterstitialAd *_interstitial; } - (void)loadInterstitial { [GADInterstitialAd loadWithAdUnitID:@"ca-app-pub-3940256099942544/4411468910" request:[GADRequest request] completionHandler:^(GADInterstitialAd *ad, NSError *error) { if (error) { NSLog(@"插页广告加载失败: %@", error.localizedDescription); return; } _interstitial = ad; _interstitial.fullScreenContentDelegate = self; }]; } - (void)showInterstitial:(UIViewController *)parentVC { if (_interstitial) { [_interstitial presentFromRootViewController:parentVC]; } else { [self loadInterstitial]; } } @end

3.3 激励视频(Rewarded)实现

// AdsRewarded.h @interface AdsRewarded : NSObject <GADFullScreenContentDelegate> - (void)loadRewardedAd; - (void)showRewardedAd:(UIViewController *)parentVC; @end // AdsRewarded.m @implementation AdsRewarded { GADRewardedAd *_rewardedAd; BOOL _userEarnedReward; } - (void)loadRewardedAd { [GADRewardedAd loadWithAdUnitID:@"ca-app-pub-3940256099942544/1712485313" request:[GADRequest request] completionHandler:^(GADRewardedAd *ad, NSError *error) { if (error) { NSLog(@"激励视频加载失败: %@", error.localizedDescription); return; } _rewardedAd = ad; _rewardedAd.fullScreenContentDelegate = self; }]; } - (void)showRewardedAd:(UIViewController *)parentVC { if (_rewardedAd) { [_rewardedAd presentFromRootViewController:parentVC userDidEarnRewardHandler:^{ _userEarnedReward = YES; }]; } else { [self loadRewardedAd]; } } @end

4. Cocos与原生代码的桥接实现

实现Cocos JavaScript与原生Objective-C代码的交互是核心难点:

4.1 Objective-C到JavaScript的回调

创建ObjectToJs.mm文件处理回调(注意必须是.mm扩展名):

// ObjectToJs.mm #import "cocos2d.h" #import "cocos/scripting/js-bindings/jswrapper/SeApi.h" @implementation ObjectToJs + (void)rewardUser { std::string jsCallStr = "cc.find('Canvas').getComponent('AdManager').onRewardComplete();"; se::ScriptEngine::getInstance()->evalString(jsCallStr.c_str()); } @end

4.2 JavaScript调用原生方法

在Cocos中创建AdManager.ts脚本:

const {ccclass, property} = cc._decorator; @ccclass export default class AdManager extends cc.Component { showBanner() { if (cc.sys.os === cc.sys.OS_IOS) { jsb.reflection.callStaticMethod("AdsBanner", "showBanner"); } } showInterstitial() { if (cc.sys.os === cc.sys.OS_IOS) { jsb.reflection.callStaticMethod("AdsInterstitial", "showInterstitial"); } } showRewarded(callback: Function) { this._rewardCallback = callback; if (cc.sys.os === cc.sys.OS_IOS) { jsb.reflection.callStaticMethod("AdsRewarded", "showRewarded"); } } private _rewardCallback: Function = null; onRewardComplete() { if (this._rewardCallback) { this._rewardCallback(); this._rewardCallback = null; } } }

5. 欧盟GDPR合规处理

针对欧盟地区用户,必须实现用户消息平台(UMP)SDK:

// GDPRConsentManager.h @interface GDPRConsentManager : NSObject + (void)requestConsentIfNeeded:(UIViewController *)parentVC; @end // GDPRConsentManager.m #import <UserMessagingPlatform/UserMessagingPlatform.h> @implementation GDPRConsentManager + (void)requestConsentIfNeeded:(UIViewController *)parentVC { UMPRequestParameters *params = [[UMPRequestParameters alloc] init]; params.tagForUnderAgeOfConsent = NO; [UMPConsentInformation.sharedInstance requestConsentInfoUpdateWithParameters:params completionHandler:^(NSError *error) { if (error) { NSLog(@"Consent info update failed: %@", error); return; } if (UMPConsentInformation.sharedInstance.consentStatus == UMPConsentStatusRequired) { [self loadConsentForm:parentVC]; } }]; } + (void)loadConsentForm:(UIViewController *)parentVC { [UMPConsentForm loadWithCompletionHandler:^(UMPConsentForm *form, NSError *error) { if (error) { NSLog(@"Consent form load failed: %@", error); return; } [form presentFromViewController:parentVC completionHandler:^(NSError *error) { if (UMPConsentInformation.sharedInstance.consentStatus == UMPConsentStatusObtained) { // 可以开始请求广告 [[GADMobileAds sharedInstance] startWithCompletionHandler:nil]; } }]; }]; } @end

6. 常见问题与解决方案

在实际开发中,我们遇到了以下几个典型问题:

6.1 模拟器广告加载失败

现象:

Failed to load interstitial ad with error: Cannot find an ad network adapter with the name(s): com.google.DummyAdapter

解决方案:

  1. 确保在真机测试,模拟器不支持广告加载
  2. 检查所有必需框架是否正确添加
  3. 确认-ObjC链接器标记已设置

6.2 广告无法展示

排查步骤:

  1. 检查AdMob应用ID和广告单元ID是否正确
  2. 确认测试设备已添加到AdMob后台的测试设备列表
  3. 查看Xcode控制台输出的详细错误信息

6.3 iOS 14+追踪权限处理

需要在应用启动时请求追踪权限:

// AppDelegate.m - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if (@available(iOS 14, *)) { [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) { // 根据status处理广告初始化 }]; } return YES; }

7. 上架App Store前的最终检查

提交应用到App Store前,请确认:

  1. 广告测试代码已移除或禁用
  2. 所有隐私权限描述文案已正确配置
  3. GDPR合规流程完整测试
  4. 广告内容在真机各iOS版本测试通过
  5. 应用元数据中声明了广告标识符(IDFA)使用

经过这些步骤,你的Cocos Creator 2.x游戏应该已经成功集成了Google AdMob广告SDK。在实际项目中,建议先进行全面测试,确保各广告类型在不同场景下都能稳定运行。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询