cocos2dx-3.9 集成admob

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间歇性发作,你被墙了!可以在测试设备上打开VPNFQ测试

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

 

posted @ 2015-12-06 09:38  Ethan.Tang  阅读(2171)  评论(1编辑  收藏  举报