博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cocos2dx-3.9 集成admob
阅读量:6503 次
发布时间:2019-06-24

本文共 3054 字,大约阅读时间需要 10 分钟。

Part 1: 安装GoogleMobileAds framework (即admob)

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

   sudo gem install cocoapods

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

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 

基于一些以我目前水平无法解答的原因,我无法在一个.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间歇性发作,你被墙了!可以在测试设备上打开VPNFQ测试

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

 

转载于:https://www.cnblogs.com/qianyuming/p/5023018.html

你可能感兴趣的文章
在相同的主机上创建一个duplicate数据库
查看>>
Date15
查看>>
从Date类型转为中文字符串
查看>>
基于multisim的fm调制解调_苹果开始自研蜂窝网调制解调器 最快2024年能用上?
查看>>
mupdf不支持x64_Window权限维持(七):安全支持提供者
查看>>
cf修改游戏客户端是什么意思_瓦罗兰特很有可能取代cf成为国内最火的fps游戏...
查看>>
proto文件支持继承吗_JavaScript继承(一)——原型链
查看>>
labview如何弹出提示窗口_LabVIEW开发者必读的问答汇总,搞定疑难杂症全靠它了!...
查看>>
提取series中的数值_Python中None和numpy.nan的区别
查看>>
hikariconfig mysql_HikariConfig配置解析
查看>>
mysql批量数据多次查询数据库_mysql数据库批量操作
查看>>
jquery 乱码 传参_jquery获取URL中参数解决中文乱码问题的两种方法
查看>>
JDBC_MySQL_jdbc连接mysql_MySQL
查看>>
mysql cte的好处_Mysql 8 重要新特性 - CTE 通用表表达式
查看>>
zcu106 固化_xilinx zcu106 vcu demo
查看>>
java ftpclient 代码_java后台代码ftpclient下载文件
查看>>
java数据库生成model_继承BaseModelGenerator 生成Model时添加数据库表字段 生成代码示例...
查看>>
java面向对象的概念_java面向对象(上)-- 面向对象的概念
查看>>
java内部类访问外部类变量 final_Java内部类引用外部类中的局部变量为什么必须是final问题解析...
查看>>
java 栈帧与类的关系_深入理解Java虚拟机之类运行时栈帧结构
查看>>