三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Cocos Creator 2.x 游戏接入 Google AdMob 广告的完整避坑指南(iOS平台,含Xcode 12配置)

Cocos Creator 2.x 游戏接入 Google AdMob 广告的完整避坑指南(iOS平台,含Xcode 12配置)

Cocos Creator 2.x iOS平台Google AdMob广告接入实战全解析

在移动游戏开发领域,广告变现是独立开发者和小团队的重要收入来源。对于使用Cocos Creator 2.x版本的开发者来说,如何在iOS平台上顺利接入Google AdMob广告SDK,同时避免各种"坑",是一个既关键又充满挑战的任务。本文将带你从零开始,一步步完成整个接入流程,特别针对Xcode 12环境和Cocos Creator 2.4.3版本中的常见问题进行深入解析。

1. 环境准备与基础配置

1.1 开发环境检查清单

在开始之前,请确保你的开发环境满足以下要求:

  • 操作系统:macOS Big Sur 11.5或更高版本
  • 开发工具:Xcode 12.0或更新版本
  • 游戏引擎:Cocos Creator 2.4.3(其他2.x版本也可参考)
  • 网络环境:能够正常访问Google开发者资源

提示:建议在开始前关闭其他Xcode项目,避免可能的冲突和资源占用问题。

1.2 SDK获取与导入

Google AdMob SDK的获取有两种主要方式:

  1. 手动下载方式(推荐给不熟悉CocoaPods的开发者):

    • 访问 Google AdMob官方下载页面
    • 下载最新版SDK(本文基于8.9.0版本)
    • 解压后通常会得到7个框架文件
  2. CocoaPods方式(适合熟悉依赖管理的开发者): 在Podfile中添加:

    pod 'Google-Mobile-Ads-SDK'

对于大多数Cocos Creator开发者,手动下载方式更为直观。将下载的框架文件拖入Xcode项目时,务必勾选"Copy items if needed"选项,确保文件被正确复制到项目目录中。

1.3 链接器标志设置

这是最容易出错的一个环节。在Xcode项目中:

  1. 选择你的Target → Build Settings
  2. 搜索"Other Linker Flags"
  3. 添加-ObjC和$(inherited)标志
典型错误现象: 如果缺少这个设置,可能会导致广告无法加载,控制台出现类似错误: "Failed to load interstitial ad with error: Cannot find an ad network adapter..."

2. 项目配置关键步骤

2.1 Info.plist必要配置

在项目的Info.plist文件中,需要添加以下关键配置项:

Key类型值说明
NSUserTrackingUsageDescriptionString"您的数据将用于提供更好的个性化广告体验"iOS 14+用户追踪权限描述
GADApplicationIdentifierString你的AdMob应用ID格式如"ca-app-pub-xxxxxxxx~yyyyyyyy"
GADIsAdManagerAppBooleanYES标识使用AdMob管理广告

注意:GADApplicationIdentifier可以在AdMob后台找到,测试阶段可以使用Google提供的测试ID:"ca-app-pub-3940256099942544~1458002511"

2.2 欧盟用户合规配置

针对欧盟地区的用户,还需要添加以下可选配置:

<key>GADDelayAppMeasurementInit</key> <true/>

这个设置会延迟应用测量初始化,确保在获得用户同意前不收集数据。

3. 代码实现与桥接

3.1 Objective-C广告管理类

创建一个AdmobManager类来统一管理各种广告类型:

// AdmobManager.h #import <Foundation/Foundation.h> #import "RootViewController.h" typedef NS_ENUM(NSInteger, AdType) { AdTypeBanner, AdTypeInterstitial, AdTypeRewarded }; @interface AdmobManager : NSObject + (instancetype)sharedInstance; - (void)initializeWithViewController:(RootViewController *)viewController; - (void)showAd:(AdType)adType; @end

对应的实现文件中,我们需要处理三种主要广告类型:

  1. 横幅广告(Banner):常驻屏幕底部的小型广告
  2. 插页广告(Interstitial):全屏广告,通常在场景切换时展示
  3. 激励广告(Rewarded):用户观看后可获得游戏内奖励的全屏广告

3.2 Cocos与原生代码互调

实现Cocos JavaScript与原生Objective-C的互调是核心难点。我们需要建立双向通信:

Cocos调用原生代码示例:

// 展示激励广告 showRewardedAd: function(rewardCallback, target) { if (cc.sys.os === cc.sys.OS_IOS) { jsb.reflection.callStaticMethod( "AdmobManager", "showRewardedAdWithCallback:target:", rewardCallback.toString(), target ); } }

原生回调Cocos示例:

// 广告奖励回调 - (void)rewardUser { NSString *jsCallStr = @"cc.find('Canvas').getComponent('AdManager').onRewardComplete();"; se::ScriptEngine::getInstance()->evalString([jsCallStr UTF8String]); }

4. 常见问题与调试技巧

4.1 广告加载失败排查指南

当广告加载失败时,可以按照以下步骤排查:

  1. 检查网络连接:确保测试设备可以访问Google服务
  2. 验证App ID:确认Info.plist中的GADApplicationIdentifier正确
  3. 检查广告单元ID:每种广告类型需要对应的广告单元ID
  4. 查看控制台日志:Xcode输出通常会提供具体错误原因
  5. 测试设备设置:在AdMob后台添加测试设备ID

4.2 iOS 14+权限处理

从iOS 14开始,需要处理ATT(App Tracking Transparency)框架:

// 请求追踪权限 if (@available(iOS 14.0, *)) { [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) { // 根据status处理不同授权状态 }]; }

记得在Info.plist中添加NSUserTrackingUsageDescription描述,否则应用会被拒绝上架。

4.3 欧盟用户同意流程

针对欧盟用户,需要使用Google的UMP(User Messaging Platform)SDK:

UMPRequestParameters *parameters = [[UMPRequestParameters alloc] init]; parameters.tagForUnderAgeOfConsent = NO; // 标记用户是否未成年 [UMPConsentInformation.sharedInstance requestConsentInfoUpdateWithParameters:parameters completionHandler:^(NSError *error) { if (error) { // 处理错误 } else { // 检查并展示同意表单 } }];

5. 性能优化与最佳实践

5.1 广告预加载策略

为了提高用户体验,应该提前加载广告:

// 提前加载插页广告 - (void)preloadInterstitial { self.interstitial = nil; [GADInterstitialAd loadWithAdUnitID:@"YOUR_AD_UNIT_ID" request:[GADRequest request] completionHandler:^(GADInterstitialAd *ad, NSError *error) { if (error) { NSLog(@"插页广告加载失败: %@", error.localizedDescription); return; } self.interstitial = ad; self.interstitial.fullScreenContentDelegate = self; }]; }

5.2 广告展示频率控制

避免过度展示广告影响用户体验:

  • 设置自然断点(如关卡结束)展示插页广告
  • 激励广告要有明确的价值主张
  • 横幅广告可以考虑在特定场景才展示

5.3 多分辨率适配

特别是对于横幅广告,需要考虑不同设备的屏幕尺寸:

// 自适应横幅广告尺寸 CGRect frame = self.viewController.view.frame; if (@available(iOS 11.0, *)) { frame = UIEdgeInsetsInsetRect(self.viewController.view.frame, self.viewController.view.safeAreaInsets); } CGFloat viewWidth = frame.size.width; self.bannerView.adSize = GADCurrentOrientationAnchoredAdaptiveBannerAdSizeWithWidth(viewWidth);

在实际项目中,我遇到过广告偶尔无法加载的问题,后来发现是因为没有正确处理广告加载状态。建议为每种广告类型添加加载状态跟踪:

typedef NS_ENUM(NSInteger, AdLoadState) { AdLoadStateNotLoaded, AdLoadStateLoading, AdLoadStateReady, AdLoadStateFailed };

这样可以在尝试展示广告前先检查状态,避免无效操作。

← 返回列表