news 2026/5/28 6:38:01

不用CocoaPods!手把手教你手动集成AdMob SDK到Cocos Creator iOS项目

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
不用CocoaPods!手把手教你手动集成AdMob SDK到Cocos Creator iOS项目

手动集成AdMob SDK到Cocos Creator iOS项目的完整指南

在移动游戏开发中,广告变现是不可或缺的一环。对于使用Cocos Creator的开发者来说,如何在iOS平台上绕过CocoaPods直接集成AdMob SDK是一个值得探讨的技术话题。本文将带你一步步完成这个看似复杂实则清晰的过程。

1. 准备工作与环境配置

在开始之前,确保你的开发环境已经就绪:

  • 硬件要求:Mac电脑(建议使用较新版本的macOS)
  • 软件要求
    • Xcode 12或更高版本
    • Cocos Creator 2.4.3或更新版本
    • AdMob SDK静态库文件(最新版本)

首先需要从Google AdMob官网下载iOS SDK。访问 AdMob官方下载页面 ,选择"手动下载SDK"选项。下载完成后,你会得到一个包含以下关键文件的压缩包:

GoogleMobileAds.framework GoogleAppMeasurement.framework GoogleUtilities.framework nanopb.framework PromisesObjC.framework

注意:下载时请确保选择与你的Xcode版本兼容的SDK版本,避免后续出现链接错误。

2. 创建Cocos项目并导出Xcode工程

使用Cocos Creator创建一个新项目或打开现有项目,完成基本开发后,通过以下步骤导出Xcode工程:

  1. 在Cocos Creator编辑器中,点击菜单栏的"项目"→"构建"
  2. 在构建面板中,选择iOS平台
  3. 配置基本参数(应用名称、包名等)
  4. 点击"构建"按钮,等待工程导出完成

导出完成后,在Finder中找到生成的Xcode工程(通常位于项目目录下的build/ios文件夹),双击.xcodeproj文件在Xcode中打开。

3. 手动添加AdMob框架到Xcode项目

这是整个过程中最关键的一步,需要仔细操作:

  1. 在Xcode项目导航器中,右键点击项目名称,选择"Add Files to..."
  2. 在弹出的文件选择对话框中,导航到你下载的AdMob SDK文件夹
  3. 选择所有.framework文件(按住Command键可多选)
  4. 务必勾选"Copy items if needed"选项,这会将框架文件复制到项目目录中
  5. 确保"Add to targets"中勾选了你的主应用目标
  6. 点击"Add"按钮完成添加

添加完成后,在项目导航器中应该能看到这些框架文件。为了验证是否添加成功,可以尝试在任意Objective-C文件中导入头文件:

#import <GoogleMobileAds/GoogleMobileAds.h>

如果没有报错,说明框架添加成功。

4. 配置项目构建设置

正确的构建设置对于AdMob SDK的正常工作至关重要:

  1. 在Xcode中点击项目名称,选择"Build Settings"标签
  2. 在搜索框中输入"Other Linker Flags"
  3. 双击该选项,点击"+"按钮添加新项
  4. 输入-ObjC(注意大小写)
  5. 再添加一项$(inherited)

提示:Cocos Creator导出的项目通常已经包含这些链接器标志,但仍建议检查确认。

接下来需要配置Info.plist文件,添加AdMob所需的权限和配置:

  1. 在项目导航器中找到Info.plist文件
  2. 右键选择"Open As"→"Source Code"
  3. <dict>标签内添加以下内容:
<key>NSUserTrackingUsageDescription</key> <string>此标识符将用于向您提供更相关的广告</string> <key>GADApplicationIdentifier</key> <string>ca-app-pub-3940256099942544~1458002511</string> <key>GADIsAdManagerApp</key> <true/>

注意:GADApplicationIdentifier的值应该替换为你从AdMob后台获取的实际应用ID。

5. 实现广告功能的核心代码

现在我们来创建管理AdMob广告的核心类。首先创建一个新的Objective-C类AdmobManager

5.1 广告管理器头文件

// AdmobManager.h #import <Foundation/Foundation.h> #import "RootViewController.h" NS_ASSUME_NONNULL_BEGIN @interface AdmobManager : NSObject + (instancetype)sharedInstance; - (void)setRootViewController:(RootViewController *)viewController; // 广告展示方法 + (void)showBannerAd; + (void)showInterstitialAd; + (void)showRewardedAd; @end NS_ASSUME_NONNULL_END

5.2 广告管理器实现文件

// AdmobManager.m #import "AdmobManager.h" #import <GoogleMobileAds/GoogleMobileAds.h> @interface AdmobManager() @property (nonatomic, weak) RootViewController *rootViewController; @property (nonatomic, strong) GADBannerView *bannerView; @property (nonatomic, strong) GADInterstitialAd *interstitialAd; @property (nonatomic, strong) GADRewardedAd *rewardedAd; @end @implementation AdmobManager + (instancetype)sharedInstance { static AdmobManager *sharedInstance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedInstance = [[self alloc] init]; // 初始化AdMob SDK [[GADMobileAds sharedInstance] startWithCompletionHandler:nil]; }); return sharedInstance; } - (void)setRootViewController:(RootViewController *)viewController { self.rootViewController = viewController; } + (void)showBannerAd { [[self sharedInstance] showBannerAd]; } - (void)showBannerAd { if (!self.rootViewController) return; self.bannerView = [[GADBannerView alloc] initWithAdSize:kGADAdSizeBanner]; self.bannerView.adUnitID = @"ca-app-pub-3940256099942544/2934735716"; // 测试ID self.bannerView.rootViewController = self.rootViewController; self.bannerView.delegate = self; [self.bannerView loadRequest:[GADRequest request]]; } // 插页广告实现类似,此处省略... // 激励视频广告实现类似,此处省略... @end

6. 桥接Cocos与原生代码

为了让Cocos的JavaScript代码能够调用原生广告功能,我们需要建立桥接机制:

6.1 创建Objective-C到JavaScript的回调

// CocosBridge.mm #import "CocosBridge.h" #import "cocos2d.h" #import "cocos/scripting/js-bindings/jswrapper/SeApi.h" @implementation CocosBridge + (void)callJSFunction:(NSString *)functionName withParams:(NSArray *)params { NSMutableString *jsCall = [NSMutableString stringWithFormat:@"%@(", functionName]; for (id param in params) { if ([param isKindOfClass:[NSString class]]) { [jsCall appendFormat:@"\"%@\",", param]; } else { [jsCall appendFormat:@"%@,", param]; } } if ([params count] > 0) { [jsCall deleteCharactersInRange:NSMakeRange([jsCall length]-1, 1)]; } [jsCall appendString:@");"]; se::ScriptEngine::getInstance()->evalString([jsCall UTF8String]); } @end

6.2 在Cocos中调用原生代码

在Cocos Creator中创建一个TypeScript脚本来管理广告调用:

// AdmobController.ts const {ccclass, property} = cc._decorator; @ccclass export default class AdmobController extends cc.Component { public static instance: AdmobController = null; onLoad() { AdmobController.instance = this; cc.game.addPersistRootNode(this.node); } showBannerAd() { if (cc.sys.os === cc.sys.OS_IOS) { // @ts-ignore jsb.reflection.callStaticMethod("AdmobManager", "showBannerAd"); } } showInterstitialAd() { if (cc.sys.os === cc.sys.OS_IOS) { // @ts-ignore jsb.reflection.callStaticMethod("AdmobManager", "showInterstitialAd"); } } showRewardedAd(successCallback: Function, failCallback: Function) { if (cc.sys.os === cc.sys.OS_IOS) { this.rewardSuccess = successCallback; this.rewardFail = failCallback; // @ts-ignore jsb.reflection.callStaticMethod("AdmobManager", "showRewardedAd"); } } private rewardSuccess: Function = null; private rewardFail: Function = null; // 由原生代码调用的奖励完成方法 onRewardCompleted() { if (this.rewardSuccess) { this.rewardSuccess(); this.rewardSuccess = null; this.rewardFail = null; } } }

7. 测试与调试

完成上述步骤后,建议按照以下顺序进行测试:

  1. 编译测试:先确保项目能够正常编译通过
  2. 横幅广告测试:最先测试最简单的横幅广告
  3. 插页广告测试:测试场景过渡时的插页广告
  4. 激励视频测试:最后测试需要用户交互的激励视频

常见的调试技巧包括:

  • 在Xcode控制台查看AdMob SDK的日志输出
  • 使用测试广告ID(如本文中的示例ID)避免影响正式数据
  • 在真机上测试,模拟器可能无法完整展示所有广告类型

如果遇到广告加载失败的情况,首先检查:

  1. 网络连接是否正常
  2. AdMob应用ID和广告单元ID是否正确
  3. Info.plist中的配置是否完整
  4. 链接器标志-ObjC是否设置

8. 优化与进阶技巧

当基本功能实现后,可以考虑以下优化措施:

广告加载策略优化

  • 预加载插页广告和激励视频广告
  • 实现广告缓存机制,减少用户等待时间
  • 根据游戏场景合理安排广告展示时机

性能监控

  • 添加广告加载时间的统计
  • 监控广告展示成功率
  • 记录用户与广告的交互数据

用户体验优化

  • 设计自然的广告展示场景
  • 提供明确的激励视频奖励说明
  • 允许用户在一定时间内关闭横幅广告
// 示例:预加载插页广告 - (void)preloadInterstitialAd { GADRequest *request = [GADRequest request]; [GADInterstitialAd loadWithAdUnitID:@"YOUR_AD_UNIT_ID" request:request completionHandler:^(GADInterstitialAd *ad, NSError *error) { if (error) { NSLog(@"插页广告加载失败: %@", error.localizedDescription); return; } self.interstitialAd = ad; self.interstitialAd.fullScreenContentDelegate = self; }]; }

通过本文介绍的手动集成方法,你不仅避免了CocoaPods可能带来的依赖冲突,还获得了对项目更精细的控制能力。这种方案特别适合那些追求项目简洁性、需要长期维护的项目,或者对构建过程有特殊要求的开发团队。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/28 6:32:57

别再手动点鼠标了!用Python批量给Neo4j知识图谱上色和调整样式

别再手动点鼠标了&#xff01;用Python批量给Neo4j知识图谱上色和调整样式当你在Neo4j Browser中面对数百个杂乱无章的节点时&#xff0c;是否曾为手动调整每个节点的颜色和样式而抓狂&#xff1f;特别是在处理生物分类学知识图谱时&#xff0c;"目"、"科"…

作者头像 李华
网站建设 2026/5/28 6:26:20

零代码搭建你的第一个 AI Agent

第三章 从注册到交付手把手搭建你的第一个可以卖钱的 AI Agent"学会游泳的唯一方法是跳进水里。 本章结束时&#xff0c;你的第一个 AI Agent 必须是跑起来的&#xff0c;不是停在脑子里的。"&#x1f4cc; 读本章前&#xff0c;先确认三件事① 你已经完成了第二章的…

作者头像 李华
网站建设 2026/5/28 6:26:12

给 AI 编程助手装上大脑:209K 星的项目教它先想后做

你还在让 AI 直接写代码然后擦屁股&#xff1f;Superpowers 的做法是&#xff1a;让它在写第一行代码之前&#xff0c;先花 30 秒想清楚你到底要什么。 读完本文你将了解&#xff1a;它和其他 prompt 包有什么本质区别 | 技能自触发系统怎么做到的 | 子代理驱动开发的二阶审查机…

作者头像 李华
网站建设 2026/5/28 6:25:32

54.高通 9008 + 联发科 Preloader + 苹果 DFU,全机型救砖维修实录

摘要 本文面向具备基础Linux操作能力的维修工程师与进阶发烧友,系统阐述Android与iOS双平台刷机维修的底层原理与工程实践。内容涵盖高通、联发科、苹果A系列芯片的引导链差异,详细拆解EDL深度刷写、Fastboot分区修复、iTunes DFU恢复三大核心流程,并给出可直接运行的Pytho…

作者头像 李华
网站建设 2026/5/28 6:24:18

SCP协议与Plexa框架:基于数字肌肉记忆实现LLM实时物理控制

1. 项目概述&#xff1a;当大语言模型遇上60帧物理世界如果你尝试过让一个大语言模型去实时控制一个60帧每秒的物理模拟循环——无论是机器人、MuJoCo仿真环境&#xff0c;还是游戏里的NPC——你大概率会立刻撞上一堵墙。这堵墙不是算力不够&#xff0c;也不是模型不聪明&#…

作者头像 李华