読者です 読者をやめる 読者になる 読者になる

夏までにiPhone アプリつくってみっか!

趣味でiPhone/Androidアプリを開発し、日々勉強した事を書いています。オープンワールド系レースゲームをUnityで開発中です。

【iPhoneアプリ】AdMobメディエーションを使ってiAd, AdMob, nendを併用してみた

iPhoneアプリ BeeCluster

これまではiAdとAdMobの二つを使っていましたが、いろいろな方からnendをおすすめされたので、早速nendに登録してみました。「メディアパートナーご登録」ページから登録できます。私の場合、次の日には広告枠承認のメールが帰ってきました。

これまではiAdの広告をリクエストして、あればそれを表示、なければAdMobに切り替えて広告を表示という実装にしていました。nendも同じようにできますが、せっかくなのでAdMobメディエーションというサービスを使って複数の広告ネットワークの切り替えを実装してみます。

プログラムで広告ネットワークを切り替えている場合はアプリのリリース後に外から優先順位を変える事はできませんが、AdMobメディエーションを使えばWebサイトでの操作で簡単に優先順位を切り替えたりできます。また、プログラム上はAdMob表示用のコードだけになるのでシンプルになります。

この機会にAdMobのSDKは現時点で最新の6.5.0に更新します。
nendの最新のSDKは2.2.0です。nendの管理画面からダウンロードできます。AdMob メディエーションでnendを使うのに必要なアダプターもダウンロードしたファイルに含まれています。
iAd用のアダプターはここからダウンロードします。

これらをプロジェクトに追加しますが、README.txtなど不要なファイルは消します。同じ名前のファイルがプロジェクトに複数存在すると"Multiple build commands for output file"的なウォーニングが出てしまうためです。また、AdMobのSDKには余計なファイルがたくさん入っているので直下のファイルとAdd-ons/Mediationフォルダー以外は全て消しました。GoogleAnalyticsiOS_2.0bata4フォルダーを消すとウォーニングが出るのでプロジェクトファイルのLibrary Search Pathsからその項目を削除します。

nendのマニュアルによると、nendを使うにはAdSupport.frameworkとSecurity.frameworkをプロジェクトに追加する必要があります。AdSupport.frameworkはすでに追加済みだったので、Security.frameworkを追加しました。また、Deployment TargetがiOS6未満野場合はAdSupport.frameworkの設定をRequiredからOptionalに切り替える必要があるとのことなので切り替えます。
f:id:takujidev:20130808181144j:plain

AdMobメディエーションを使う場合はプロジェクト設定のOther Linker Flagsに -ObjC を追加する必要があります。AdMobをこれまで使っていたプロジェクトであれば既に追加されているはずです。

プログラムの実装は非常に簡単です。iAdとAdMobを切り替えていたときの実装と比べると簡単さがわかると思います。

ヘッダーファイル

#import <Foundation/Foundation.h>
#import "cocos2d.h"
#import "GADBannerView.h"

@interface AdLayer : CCLayer <GADBannerViewDelegate>
{
    
}

+ (id)layer;

@end

実装ファイル

@implementation AdLayer
{
    GADBannerView* _gadView;
    BOOL _bannerIsVisible;
}

+ (id)layer
{
    return [[self alloc] initLayer];
}

- (id)initLayer
{
    if ((self = [super init])) {
        _bannerIsVisible = NO;
        
        // AdMob設定
        CGSize winSize = [CCDirector sharedDirector].winSize;
        _gadView = [[GADBannerView alloc] initWithAdSize:kGADAdSizeBanner];
        _gadView.adUnitID = @"XXXXXXXXXXXXXXXXXXXX"; //ここにはAdMobサイトに表示されるメディエーションIDを入れる
        _gadView.rootViewController = [[[UIApplication sharedApplication] keyWindow] rootViewController];
        [[[CCDirector sharedDirector] view] addSubview:_gadView];
        _gadView.frame = CGRectOffset(_gadView.frame, 0, winSize.height);
        _gadView.delegate = self;
        [_gadView loadRequest:[GADRequest request]];
    }
    return self;
}

- (void)dealloc
{
    [_gadView removeFromSuperview];
    _gadView = nil;
}

//AdMob取得成功
- (void)adViewDidReceiveAd:(GADBannerView *)view
{
    if (!_bannerIsVisible) {
        [UIView animateWithDuration:0.3 animations:^{
            _gadView.frame = CGRectOffset(view.frame, 0, -view.frame.size.height);
        }];
        _bannerIsVisible = YES;
    }
}

//AdMob取得失敗
- (void)adView:(GADBannerView *)view didFailToReceiveAdWithError:(GADRequestError *)error
{
    [_gadView removeFromSuperview];
    _gadView = nil;
}

@end

あとはWeb上での設定です。

AdMobの管理ページの「サイトとアプリケーション」タブのプルダウンメニューから「広告ネットワーク メディエーション」を選び、表示されるページで「ネットワーク メディエーション プレースメントの追加」ボタンを押します。
f:id:takujidev:20130808183309j:plain
適当に名前を付け、プラットフォームは「iOS」、 広告サイズは「バナー - 320x50 (通常)]、自動更新はデフォールトの60秒のままです。
「保存して次へ」ボタンを押します。
f:id:takujidev:20130808183615j:plain
広告ネットワークからNendを探しチェックし、下の設定のところにSpot IDとAPI Keyを入力します。これらはnendの管理画面の「広告枠」ボタン、「SDK」ボタンを押した先のページで見られます。
なにげにnendの画面とAdMobの画面で表示順序が逆になっているのでコピペするときはご注意です。
同様にiAdとAdMobにもチェックを入れて保存します。なお、iAdとAdMobには設定項目はありません。
f:id:takujidev:20130808184703j:plain
取りあえずの設定は完了です。
ここで表示されるメディエーションIDをプログラムのXXXXXXXXXXの部分にコピペします。
ちまみに、Googleのサイトの説明では

bannerView_.adUnitID = e123456789012345;

となっていますが、これだとエラーになります。

bannerView_.adUnitID = @"e123456789012345";

こうすべきですね。

AdMobメディエーション管理画面で有効スイッチを切り替える事で広告を止める事ができます。
また、有効CPMに数値を入れる事で表示の優先順位を変えられるようですが、どういう数値が適当なのかまだよくわかっていません。
取りあえず、nendを$20.00, iAdを$10.00, AdMobを$0.00にして、評判の良いnendの優先順位を上げてみました。$20.00が妥当な数値なのかわかりませんが、取りあえずnendからの広告が主に表示されているようです。
Webでの設定変更が実際にアプリの動作に適用されるまで少し時間がかかるので焦りは禁物です。
初期設定だとAdMobばかり表示され、設定をあれこれ変えてもすぐに反映されなかったので最初は少し焦りました。