Cocos2dにAdMobのメディエーションでAppBank Networkを組み込むまで

Cocos2dのv2にAdMobのMediationを組み込んでみました。 これまではAdWhirlを使って多数のアドネットワークを切り替えて表示していましたが、サポート終了に伴って、後継のメディエーションを使ってみました。

後継だけあって、メディエーションの方が楽に組み込みや設定ができるようになっているようですが、なにぶん情報がまだ少なくて苦労したのでメモしておきます。

メディエーション

まずAdMobのサイトからiOS用のAdMobのSDKをダウンロードしてXcodeのプロジェクトに取り込みます。
ダウンロードしたSDKにメディエーションのモジュールも含まれているので一緒にインポートします。

メディエーションでAdMob以外の広告を使う場合は(使わないとメディエーションを使う意味が無いのでひとつ以上は使うはずですが)、それぞれのアド広告用のアダプターモジュールも別途ダウンロードして一緒にインポートします。

AdMobでは有名なアド広告のアダプターがあらかじめ用意されています。 筆者はiAdを使うのでiAd用のアダプターをダウンロードしました。
libAdapterIAD.aがiAd用のアダプターです。

あらかじAdMobで用意されているアダプターが無い場合は、作る必要があります。

筆者はAppBank Networkも使うので、AppBank Networkのアダプターは別途作成しました。
下の方にある、AppBankEventBanner.hとAppBankEventBanner.mがAppBank Networkのリクエストを処理するためのアダプタークラスです。

さらに、iAdとAdMob以外のアド広告を使う場合は別途それぞれのSDKもダウンロードしてインポートしておきます。
上の方のNendAdフォルダはAppBank NetworkのSDKです。

フレームワーク

あとは、使うアド広告に応じて必要なフレームワークを追加しておきます。
AdMob、iAd、AppBank Networkを使うならこんな感じになります。
各アドネットワークのドキュメントを参照して必要なフレームワークを追加しましょう。
※左の画像ではTwitter用など一部広告とは関係のないのも含まれています。

ここまでが準備です。

これから実装です。

 

まず、AppDelegate.hに下記を追加します。

#import “GADBannerView.h”

次に、AppDelegate.mのimplementationの部分に下記を追加します。

@implementation AppController

{

    //Admob

    GADBannerView *gadbanner_;

}

それから、applicationメソットの下の方に下記のように追記します。 delgateはそれぞれのアプリに応じて設定してください。

    // make main window visible

    [window_makeKeyAndVisible];

    // AdMob Mediation

    gadbanner_ = [[GADBannerViewalloc] initWithAdSize:kGADAdSizeBanner];

    gadbanner_.adUnitID = @”XXXXXXXXXXXXXXXX”;

    gadbanner_.rootViewController = [[[UIApplicationsharedApplication] keyWindow] rootViewController];

    gadbanner_.delegate = [CGTGameGlobalsharedManager];

    [[[CCDirectorsharedDirector] view] addSubview:gadbanner_];

    GADRequest *request = [GADRequest request];

    request.testing = NO;

    [gadbanner_ loadRequest:request];

ここで、ユニバーサルアプリの場合は下記のように、デバイスによって広告のサイズを切り替えられるようにします。

    // make main window visible

    [window_makeKeyAndVisible];

    // AdMob Mediation

    // iPhone only

    if( [[UIDevicecurrentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)

    {

        //iPad

        gadbanner_ = [[GADBannerViewalloc] initWithAdSize:kGADAdSizeLeaderboard];

    } else {

        //iPhone

        gadbanner_ = [[GADBannerViewalloc] initWithAdSize:kGADAdSizeBanner];

    }

    gadbanner_.adUnitID = @”XXXXXXXXXXXXXXXX”;

    gadbanner_.rootViewController = [[[UIApplicationsharedApplication] keyWindow] rootViewController];

    gadbanner_.delegate = [CGTGameGlobalsharedManager];

    [[[CCDirectorsharedDirector] view] addSubview:gadbanner_];

    GADRequest *request = [GADRequest request];

    request.testing = NO;

    [gadbanner_ loadRequest:request];

 

adUnitIDはAdMobのIDではなく、メディエーションのIDが発行されるのでそちらを入力します。
これで、広告が表示されるようになると思いますが、筆者AppBank Networkを使っているので前述したAppBankEventBanner.hとAppBankEventBanner.mを以下のように用意しました。

AppBankEventBanner.h

#import <Foundation/Foundation.h>

#import “GADCustomEventBanner.h”

#import “NADView.h”

@interface AppBankEventBanner : NSObject <NADViewDelegate, GADCustomEventBanner>

{

    NADView* appbankView;

}

@property (nonatomic, assign) id<GADCustomEventBannerDelegate>delegate;

@end

AppBankEventBanner.m

#import “AppBankEventBanner.h”

@implementation AppBankEventBanner

@synthesize delegate;

#pragma mark –

#pragma mark GADCustomEventBanner

– (void)requestBannerAd:(GADAdSize)adSize

              parameter:(NSString *)serverParameter

                  label:(NSString *)serverLabel

                request:(GADCustomEventRequest *)request  {

    // TODO: Use the parameters and self.delegate to make a banner request to your

    // ad network. Remember to set this class to be your banner’s delegate.

    appbankView = [[NADViewalloc] initWithFrame:CGRectMake(0,0,NAD_ADVIEW_SIZE_320x50.width, NAD_ADVIEW_SIZE_320x50.height)];

    [appbankViewsetNendID:@”XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX”spotID:@”XXXXX”];

    [appbankViewsetDelegate:self];

    [appbankViewsetRootViewController:[[[UIViewControlleralloc] init] autorelease]];

    [appbankViewload:nil];

}

-(void)dealloc

{

    NSLog(@”%@: %@”, NSStringFromSelector(_cmd), self);

    appbankView.delegate = nil;

    [appbankViewrelease];

    appbankView = nil;

    //self.delegate = nil;

    [super dealloc];

}

/* AppBank */

//- (void)performEventAppBank:(NADView *)adwView {

//    NSLog(@”%@: %@”, NSStringFromSelector(_cmd), self);

//}

– (void)nadViewDidFinishLoad:(NADView *)adView {

    NSLog(@”%@: %@”, NSStringFromSelector(_cmd), self);

    [self.delegatecustomEventBanner:selfdidReceiveAd:adView];

}

#pragma mark –

#pragma mark MyBanner Callbacks

– (void)adViewDidReceiveAd:(NADView *)view {

    [self.delegatecustomEventBanner:selfdidReceiveAd:view];

}

– (void)adView:(NADView *)view

didFailToReceiveAdWithError:(NSError *)error {

    [self.delegatecustomEventBanner:selfdidFailAd:error];

}

– (void)adViewWillPresentScreen:(NADView *)adView {

    [self.delegatecustomEventBannerWillPresentModal:self];

}

– (void)adViewWillDismissScreen:(NADView *)adView {

    [self.delegatecustomEventBannerWillDismissModal:self];

}

– (void)adViewDidDismissScreen:(NADView *)adView {

    [self.delegatecustomEventBannerDidDismissModal:self];

}

– (void)adViewWillLeaveApplication:(NADView *)adView {

    [self.delegatecustomEventBannerWillLeaveApplication:self];

}

@end

こんな感じ。
クラス名はメディエーションの管理画面でカスタムイベントを追加するときに指定したクラス名にあわせましょう。

iPhoneだと問題なく表示されると思いますが、iAd以外の広告がRetina対応されていない気がします。
単純に広告が対応していないのか、何か設定や実装に問題があるのか、分かりません。

iPad だと微妙です。iPadではアドネットワークによって広告のサイズが違うのが影響しているようで、iAdの広告が表示されずAppBank Networkは(多分)iPadサイズの広告を配信していないので小さい広告が表示されます。
iPadの場合はメディエーションを使わずにiAd固定にした方が良いかもしれません。

それと、ゲームでは広告を表示するとき自動でPAUSE状態にしたいところです。
広告がクリックされたことをdelegateに通知してくれるかどうかは、アドネットワークに依存するようです。
AppBank Networkでは広告をクリックされても通知される仕組みがないようなので、検知できません。
そのような場合は、アプリがバックグランドに回るときに呼ばれる、AppDelegate.mのapplicationDidEnterBackgroundメソッドで処理するのが良いです。

フリック!計算ではメディエーションを使ってます。 IMG 2279

 

 

Tags: , , , , , , , , ,