2012年3月17日土曜日

iAdを組み込む

せっかくなのでiAdを試してみました。やりたかった事は以下の通りです。
  • iAdが表示できなかったらAdMobの広告を表示したい
  • iOS3はiAdが使えないので、 無条件でAdMobを表示したい

登録


で、まずはiAdを利用するために、様々申請が必要です。全てiTunes Connectで行います。
以下のページに詳しく解説されていました。ほとんどこの通りにやりました。

 Contracts, Tax, and Banking 銀行と税金の契約 | iPhone使いへの道

 あ、1点だけ違う点が。「Account Holder Name(口座名義)」をカタカナで入力しました。入力時に脇のヘルプにそのように書いてあったので。

コーディング


申請が無事完了したら、次は一番大事なコーディングです。
これもまた、以下のページを参考にさせていただきました。

管理人の部屋: [続] iAdをメインにしてAdmobをバックアップとして設置

大枠はそのままなのですが、若干手を加えたので、ソースを掲載します。
あとで使い回しをしやすいように、カテゴリでソースを分けてあります。

ViewController+Ad.h
#import "ViewController.h"
#import <iAd/iAd.h>
#import "GADBannerView.h"

@interface ViewController()
{
    BOOL _iAdIsVisible;
    ADBannerView *_iAdView;
    BOOL _isEnableAdMob;
    GADBannerView *_adMobView;
}
@end

@interface ViewController(Ad) <ADBannerViewDelegate, GADBannerViewDelegate>

// 広告を開始する
- (void)startAd;

// 広告を解放する
- (void)releaseAd;

// private methods
- (void)startiAd;
- (void)startAdMob;
- (void)stopAdMob;

@end

ViewController+Ad.m
#import "ViewController+Ad.h"

#define ADMOB_PUBLISHER_ID @"???????????????"

@implementation ViewController(Ad)

- (void)startAd
{
    // iAd (iOS4.0以上)
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 4.0) {
        [self startiAd];
    }
    else {
        [self startAdMob];
    }
    
    return;
}

- (void)releaseAd
{
    // AdMob
    if (_isEnableAdMob) {
        _adMobView.delegate = nil;
        [_adMobView release];
    }
    
    //iAd
    _iAdView.delegate = nil;
    [_iAdView release];
    
    return;
}

#pragma mark - iAd

- (void)startiAd
{
    LOG(@"iAd:startiAd");
    
    // iAd初期化
    _iAdView = [[ADBannerView alloc] initWithFrame:CGRectZero];
    
    // サイズ設定
    NSString *identifier;
    if (&ADBannerContentSizeIdentifierPortrait != nil) {
        identifier = ADBannerContentSizeIdentifierPortrait;
    }
    else {
        identifier = ADBannerContentSizeIdentifier320x50;
    }
    _iAdView.requiredContentSizeIdentifiers = [NSSet setWithObject:identifier];
    _iAdView.currentContentSizeIdentifier = identifier;
    
    // 下に配置
    CGSize bannerSize = [ADBannerView sizeFromBannerContentSizeIdentifier:identifier];
    _iAdView.frame = CGRectOffset(_iAdView.frame, 0, self.view.frame.size.height - bannerSize.height);
    
    // 隠しておく
    _iAdView.hidden = YES;
    _iAdView.alpha = 0.0f;
    
    // delegate
    _iAdView.delegate = self;
    
    [self.view addSubview:_iAdView];
}

// iAdによって広告がloadされた時に実行される
- (void)bannerViewDidLoadAd:(ADBannerView *)banner
{
    LOG(@"iAd:bannerViewDidLoadAd");
    
    // AdMob非表示
    [self stopAdMob];
    
    if (_iAdIsVisible == NO) {
        // iAdを表示
        [UIView beginAnimations:@"iAdViewShow" context:NULL];
        _iAdView.alpha = 1.0f;
        [UIView commitAnimations];
        _iAdView.hidden = NO;
        _iAdIsVisible = YES;
    }
}

// iAdが広告の読み込みに失敗したときに実行される
- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
{
    LOG(@"iAd:didFailToReceiveAdWithError %@", [error localizedDescription]);
    
    if (_iAdIsVisible) {
        // iADを隠す
        _iAdView.hidden = YES;
        _iAdView.alpha = 0.0f;
        _iAdIsVisible = NO;
    }
    
    // Admob開始
    [self startAdMob];
}

// ユーザが広告をタップしたときに実行される
- (BOOL)bannerViewActionShouldBegin:(ADBannerView *)banner willLeaveApplication:(BOOL)willLeave
{
    LOG(@"Banner view is beginning an ad action");
    BOOL shouldExecuteAction = YES;
    if (!willLeave && shouldExecuteAction)
    {
        // ここにコードを挿入して、広告と競合する可能性のあるサービスを一時停止する
    }
    return shouldExecuteAction;
}

#pragma mark - AdMob

- (void)startAdMob
{
    LOG(@"AdMob:startAdMob isEnableAdMob: %d", _isEnableAdMob);
    
    if (_isEnableAdMob) return;
    
    // 確保
    _adMobView = [[GADBannerView alloc]
                  initWithFrame:CGRectMake(0.0,
                                           self.view.frame.size.height - GAD_SIZE_320x50.height,
                                           GAD_SIZE_320x50.width,
                                           GAD_SIZE_320x50.height)];
    
    // 隠しておく
    _adMobView.hidden = YES;
    _adMobView.alpha = 0.0f;
    
    // 配置
    _adMobView.adUnitID = ADMOB_PUBLISHER_ID;
    _adMobView.delegate = self;
    _adMobView.rootViewController = self;
    [self.view addSubview:_adMobView];
    
    // リクエスト
    GADRequest *request = [GADRequest request];
    [_adMobView loadRequest:request];
    
    _isEnableAdMob = YES;
    
    return;
}

- (void)stopAdMob
{
    LOG(@"AdMob:stopAdMob isEnableAdMob: %d", _isEnableAdMob);
    
    if (_isEnableAdMob == NO) return;
    
    // 解放
    [_adMobView removeFromSuperview];
    _adMobView.delegate = nil;
    [_adMobView release];
    _isEnableAdMob = NO;
    
    return;
}

- (void)adViewDidReceiveAd:(GADBannerView *)adView
{
    LOG(@"AdMob:adViewDidReceiveAd");
    
    // AdMobを表示
    [UIView beginAnimations:@"AdMobViewShow" context:NULL];
    adView.alpha = 1.0f;
    [UIView commitAnimations];
    adView.hidden = NO;
    
    return;
}

- (void)adView:(GADBannerView *)view didFailToReceiveAdWithError:(GADRequestError *)error
{
    LOG(@"AdMob:didFailToReceiveAdWithError %@", [error localizedFailureReason]);
    [self stopAdMob];
}

@end

アプリ申請


残る注意点としては、アプリ申請後にiTunes Connectの[Manage Your Applications]でiAdを有効にするのをお忘れなく、といったところでしょうか。


iAdを組み込んだアプリを申請しました。どうなるか楽しみです。

0 件のコメント:

コメントを投稿