Part 1: 安装GoogleMobileAds framework (即admob)

1. 安装Cocoapods,否则解决依赖关系和配置真的会把人不累死也得烦死

sudo gem install cocoapods

国内用户安装过程中可能遇到SSL连接出错的问题,请参考 Cocoapod安装过程中的幺蛾子

2. 在 xxx.xcodeproj 同级目录下,加入新文件Podfile,内容如下:

source 'https://github.com/CocoaPods/Specs.git'

platform :ios, '7.0'
pod 'Google-Mobile-Ads-SDK', '~> 7.5'
  • source 指定pod从哪里去下载新的framework

  • platform指定引入的工程使用平台版本, 这个版本号可能会高于cocos2dx创建出的默认最低版本,需要注意

  • pod一行指定取哪个版本的sdk

3. 关闭Xcode中打开的xxx.xcodeproj, 在Podfile所在目录下使用命令 pod update

4. 现在Podfile目录下多出了xxx.xcworkspace, Podfile.lock, Pods几个文件或文件夹,使用Xcode打开xxx.xcworkspace, 然后编译

5. 如果编译没出错,那么就可以继续咯!

Part2: 使用admob

在此之前,你应该先去读一下 https://github.com/googleads/googleads-mobile-ios-examples 中的源码,看一下官方对Banner和Interstitial给出的示例。具体的代码照抄就可以了。

首先,官方案例是这么import framework的:

@import GoogleMobileAds;

... bla bla~

然后在cocos2dx的工程中,你如果这么写,肯定会提示模块没被启用,如果你真要这么写,那就去Build Settings里面把modules启用好了

你可能会希望在.h中声明一个C++类,然后在一个.mm中引入GoogleMobileAds,实现一个内部类,然后再用一个struct桥接到C++以供C++代码调用?放弃这种方式吧,因为:

@import语法只能在Objective-C中使用,目前Objective-C++不支持这种语法,哪怕你只是把文件扩展名改成.mm也不行

所以可以代替的办法是酱紫:

#import <GoogleMobileAds/GoogleMobileAds.h>

基于一些以我目前水平无法解答的原因,我无法在一个.mm中引入GoogleMobileAds中的类,所以最后只好单独在一套.h/.m文件中实现一个Objective-C的类,然后在一个专门的.h/.mm中实现一个C++类桥接之。

关于桥接:

C++类无法直接把一个Objective-C的类作为成员参数,所以一般办法是,在 .h中:

struct AdBannerBridge;

class AdBanner
{
//...
AdBanner();
~AdBanner();
protected:
AdBannerBridge* _adBridge;
}

然后在.mm中,就可以顺理成章的引用Objective-C的实体了:

struct AdBannerBridge
{
GoogleAd* _googleAd;
AppleAd* _appleAd; AdBannerBridge()
{
_appleAd = [[AppleAd alloc]init];
//...
} ~AdBannerBridge()
{
if( _appleAd != nil ) {
[_appleAd release];
}
//...
}
} AdBanner::AdBanner()
{
_adBridge = new AdBannerBridge();
} AdBanner::~AdBanner()
{
if( _adBridge ) {
delete _adBridge;
}
}

编译Objective-C++时, Objective-C的注入@interface/@implementation/@protocol当然是按照Objective-C的方式编译的,其它部分都是按照C++语法编译的。C++中struct本质上就是class,所以这里可以借助这个特性直接在构造函数和析构函数里完成分配和回收工作,免得代码写的太长。

GoogleMobileAds使用还是蛮简单的,解析example中的一部分代码:

- (void)viewDidLoad {
[super viewDidLoad]; // Replace this ad unit ID with your own ad unit ID.
self.bannerView.adUnitID = @"ca-app-pub-3940256099942544/2934735716";
self.bannerView.rootViewController = self; GADRequest *request = [GADRequest request];
// Requests test ads on devices you specify. Your test device ID is printed to the console when
// an ad request is made. GADBannerView automatically returns test ads when running on a
// simulator.
request.testDevices = @[
@"01d5d30957fabc2cce72c5559550686e" // Eric's iPod Touch
];
[self.bannerView loadRequest:request];
}

1. adUnitID 在开发时应该换成自己的ad unit ID

2. Google政策上禁止开发期间点击自己的广告,不过测试广告还是可以点的。指定testDevices之后,在这些testDevices上运行时,都会返回一个测试广告,这个测试广告是可以点击的。

testDevice的ID可以先直接变异运行,该ID会在log中显示出来。

3. 如果Delegate已经调用adViewDidReceiveAd,但是广告却显示一个0,那么很可能是因为GFW间歇性发作,你被墙了!可以在测试设备上打开VPN翻墙测试

4. 我在一个.h/.m中实现的GoogleMobileAd调用,但是希望在delegate中能够调用C++部分的pause/resume来处理用户点击广告但是没有离开程序的情形,这时候可以通过传递代码块来解决

最新文章

  1. 获取当前方法名,行号,类名,所在java文件第几行
  2. 【转】mysql的union、left join、 right join、 inner join和视图学习
  3. linux中添加ftp用户,并设置相应的权限
  4. nodejs 80端口监听失败及NODE_PATH不起作用的问题
  5. Mac OS X 安装ruby环境
  6. .net反射详解(转)
  7. 火狐和IE的window.event对象详解(转载)
  8. iScroll.js 用法参考
  9. 最长回文子串(Longest Palindromic Substring)-DP问题
  10. 【转】Device Tree(三):代码分析
  11. Python-windows服务-重启自动化
  12. 根据key存不存在查询json
  13. 个人作业3——个人总结(Alpha阶段)
  14. node-删除对象中指定属性失效问题-JSON.parse实例化
  15. Inotify机制的简单应用
  16. springcloud的配置文件的读取顺序
  17. Java 基础 引用数据类型 ArrayList集合
  18. Java多线程循环打印ABC的5种实现方法
  19. 【Source Insight 】之marco学习笔记1
  20. 【Java】JVM(六)虚拟机字节码执行引擎

热门文章

  1. js节点操作
  2. 查找数组中重复项的index
  3. .NET牛人需要了解的问题[转]
  4. Redis常用命令入门4:集合类型
  5. 在Mac上安装Sublime Text3的插件
  6. MySql学习(六) —— 数据库优化理论(二) —— 查询优化技术
  7. Android获取屏幕实际高度跟显示高度,判断Android设备是否拥有虚拟功能键
  8. 如何更方便地调试javascript代码
  9. vs启动调试很慢的解决办法
  10. 华为地铁换乘 Java