Cocos2d-xでiPhone&Androidアプリ開発記4 AdMobメディエーションでAdMob+iAd iOS編

admobCocos2dxで広告を表示するにはiOSとAndroid別々に設定が必要です。広告はCocos2dxのSceneの更に上に表示されます。というわけでワンソースは無理。とりあえず今回はiOSの設定をします。

以前は広告も各社ごとに実装が必要でしたが、現在はAdModで各社の広告を一括管理する『AdMobメディエーション』が便利です。AdMobの実装だけで、後はAdMobのWEB管理画面で制御できるようになります。

デメリットとして、何らかの理由によりGoogleの広告配信サーバーに繋がらない場合はiAdを表示する。といった事はできなくなります。個人的にはメリットがずっと大きいと思います。

 

前準備

今回の実装はリンクエラーなどにハマって大変でした。

まずはAdModに登録。AdModSDKのダウンロードも必要ですが、これらは特に説明の必要はないと思います。

iAd用メディエーションのアダプターlibAdapterIAD.aが必要になります。

必要なもの

  • Cocos2dx 2.2.2
  • GoogleAdMobAdsSdkiOS-6.5.1
  • libAdapterIAD.a

libAdapterIAD.a ダウンロード先

Mediation Networks - Google Mobile Ads SDK — Google Developers

 

XCodeにて

GoogleAdMobAdsSdkiOSの解凍後フォルダにlibAdapterIAD.aを入れておきます。 そしてフォルダごとXCodeのプロジェクト上のResourcesにドラッグ&ドロップでコピー。

次にARC対応でOther Linker Flagsに-ObjCを設定。

Build Phases > Link Binary With Librariesにフレームワーク追加

  • SystemConfiguration.framework
  • MessageUI.framework
  • AudioToolbox.framework
  • StoreKit.framework
  • AdSupport.framework
  • iAd.framework

この時点でビルドしてみて問題なければ次。私は下の問題が発生。

数時間を消費した問題2つ

GoogleAnalyticsServicesiOS_3.0のUtils.mで”This file requires ARC support.”とエラー。とりあえずいらないのでAdd-ons/GoogleAnalyticsをフォルダごとプロジェクトから削除。

次になぜか既存ファイルのリンクエラー。Search Pathがおかしくなる。Cocos2dxではプロジェクトに新しいファイルを追加した時にパスが書き変わってしまう事がある模様。なぞの\が追加されてました。

Build Setting > Search Path > Library Search Paths

\"$(SRCROOT)/../../../cocos2dx/platform/third_party/ios/libraries\"
\"$(SRCROOT)/../../../external/libwebsockets/ios/lib\"
↓
"$(SRCROOT)/../../../cocos2dx/platform/third_party/ios/libraries"
"$(SRCROOT)/../../../external/libwebsockets/ios/lib"
参考

Xcode: Xcodeのエラー”directory not found for option…” | Lady Wendy

 

実装

いよいよAppControllerに記述。

AppController.hに普通に#import “GADBannerView.h”してもコンパイルは通るが、GAD_SIZE_320x50などの定数がリンクエラーになる。

そのため、

extern "C"{
#import "GADBannerView.h"
};

にて読み込み。

一応デリゲートも追加。

AppController.h
#import <UIKit/UIKit.h>
extern "C"{
#import "GADBannerView.h"
};

@class RootViewController;

@interface AppController : NSObject <UIApplicationDelegate,GADBannerViewDelegate> {
    UIWindow *window;
    RootViewController    *viewController;
    GADBannerView *bannerView_;
}

@end
AppController.mm
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {



/* いろいろな記述 */


    // 一番最後でメディエーション広告表示
    bannerView_ = [[GADBannerView alloc]
                   initWithAdSize:kGADAdSizeSmartBannerPortrait origin:CGPointMake(0.0,self->viewController.view.frame.size.height -CGSizeFromGADAdSize(kGADAdSizeSmartBannerPortrait).height)];
    bannerView_.adUnitID = MEDIATION_ID;
    bannerView_.rootViewController = viewController;
    bannerView_.delegate = self;
    [viewController.view addSubview:bannerView_];

    GADRequest *request = [GADRequest request];
    request.testing = YES;
    [bannerView_ loadRequest:request];

    cocos2d::CCApplication::sharedApplication()->run();

    return YES;
}

-(void)adViewDidReceiveAd:(GADBannerView *)view
{
    NSLog(@"広告取得成功");
}

-(void)adView:(GADBannerView *)view didFailToReceiveAdWithError:(GADRequestError *)error
{
    NSLog(@"広告取得失敗");
}


- (void)dealloc {
    [bannerView_ release];
    [window release];
    [super dealloc];
}

 

参考

cocos2dxでAppController内にどのように記述するかで参考になりました。

iOSで広告(admob)を表示させる。

cocos2dxではないがAdMobメディエーションで参考になりました。

iAdとAdMobを切り替えるAdMobメディエーションを実装する - paranitips

次回はAndroidで広告表示を。

 

広告