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

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

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

【cocos2d】iAd, AdMobの広告をつけてみた

cocos2d

いきなり有料のアプリをリリースするのは気が引けるので最初のアプリは無料の広告付きでリリースしたいと思います。
まずiAdでの広告表示を試みて、広告がなければAdMobの広告を表示するというのが流行りらしいので、こちらのサイト続きを参考にさせていただき、早速自分のアプリにiAdとAdMob両方の広告を組み込んでみました。
上記のサイトの例から少しアレンジして、広告バナーがアニメーションで上から出てくるようにしてみました。
[2013/4/28 追記:数十秒おきに新しい広告が読み込まれるたびにバナーの位置が下へ下へとずれていくのでこちらのAppleのガイドを参考にバナーが既に表示されていればアニメーションをしないように修正しました。]
AdMobの登録でApp名を指定するところがあり、まだ名前を決めていないので悩みましたが、とりあえず自分がわかる名前にしました。後から正式名称が決まったら編集画面で変更できるようです。また、上記のサイトにもありましたが、AdMobの支払い方法は手数料が2500円くらいかかる銀行振込よりPaypalの方がお得なようです。

ヘッダファイル

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

@interface AdLayer : CCLayer <ADBannerViewDelegate, GADBannerViewDelegate>
{
    
}

+ (id)layer;

@end

実装ファイル

#import "AdLayer.h"

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

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

- (id)initLayer
{
    if ((self = [super init])) {
        _bannerIsVisible = NO;
        // iAd設定
        _adView = [[ADBannerView alloc] initWithFrame:CGRectZero];
        _adView.currentContentSizeIdentifier = ADBannerContentSizeIdentifierPortrait;
        [[[CCDirector sharedDirector] view] addSubview:_adView];
        _adView.frame = CGRectOffset(_adView.frame, 0, -_adView.frame.size.height);
        _adView.delegate = self;
        
        // AdMob設定
        _gadView = [[GADBannerView alloc] initWithAdSize:kGADAdSizeBanner];
        _gadView.adUnitID = @"a15179168f4c6bf";
        _gadView.rootViewController = [[[UIApplication sharedApplication] keyWindow] rootViewController];
        [[[CCDirector sharedDirector] view] addSubview:_gadView];
        _gadView.frame = CGRectOffset(_gadView.frame, 0, -_gadView.frame.size.height);
        _gadView.delegate = self;
    }
    return self;
}

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

//iAd広告取得成功時の処理
- (void)bannerViewDidLoadAd:(ADBannerView *)banner
{
    if (!_bannerIsVisible) {
        [UIView animateWithDuration:0.3 animations:^{
            _adView.frame = CGRectOffset(banner.frame, 0, banner.frame.size.height);
        }];
        _bannerIsVisible = YES;
    }
    
}

//iAd広告取得失敗時の処理
- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
{
    [_adView removeFromSuperview];
    _adView = nil;
    [self loadAdmobViewRequest];
}

//AdMob取得処理
- (void)loadAdmobViewRequest
{
    GADRequest *request = [GADRequest request];
    //以下の端末ではテスト広告をリクエスト
    request.testDevices = [NSArray arrayWithObjects:
                           GAD_SIMULATOR_ID,// シミュレータ
                           nil];
    [_gadView loadRequest:request];
}

//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

今日の実行動画です。前半がiAdでの表示、後半はAdMobでの表示担っています。iAdはテスト用の広告が表示されていますが、AdMobの方は本物の広告となっています。AdMobの部分はひどく音ずれしていますが、ご了承下さい。