Objective-C (iOS): iAd

iAdViewController

Objective-C: iAdViewController.h

iAd.framework を事前にリンクしておき、本番リリースでは iTunes Connect などで iAd を ON にしておく必要があります。

#import <UIKit/UIKit.h>
#import <iAd/iAd.h>

@interface iAdViewController : UIViewController <ADBannerViewDelegate>

@end

Objective-C: iAdViewController.m

#import "iAdViewController.h"

@interface iAdViewController ()

@end

@implementation iAdViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
	
    // iAd の Banner を設置。
    // 定期的に Apple のサーバーをチェックしていて、広告が存在すれば表示される。
    // 時と場合によって、数十秒出ないので注意。
    // あと本番では iTunes Connect でちゃんと iAd の設定を終えていること。
    [self setupAdBanner];
}

#pragma mark --
#pragma mark iAd

ADBannerView *bannerView_;

- (void)setupAdBanner
{
    CGRect contentFrame = self.view.bounds;
    CGPoint bannerOrigin = CGPointMake(CGRectGetMinX(contentFrame),
                                       CGRectGetMaxY(contentFrame));
    ADBannerView *bannerView = [[ADBannerView alloc] initWithAdType:ADAdTypeBanner];
    bannerView.frame = CGRectMake(bannerOrigin.x,
                                  bannerOrigin.y,
                                  bannerView.bounds.size.width,
                                  bannerView.bounds.size.height);
    bannerView.delegate = self;
    bannerView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleTopMargin;
    
    [self.view addSubview:bannerView];
    bannerView_ = bannerView;
    
}

// 画面の回転を検知
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    [self layoutForCurrentOrientation:YES];
}

// 再レイアウト
- (void)layoutForCurrentOrientation:(BOOL)animated
{
    CGRect contentFrame = self.view.bounds;
    CGPoint bannerOrigin = CGPointMake(CGRectGetMinX(contentFrame),
                                       CGRectGetMaxY(contentFrame));
    CGFloat bannerHeight = bannerView_.bounds.size.height;
    
    if (bannerView_.bannerLoaded)
    {
        contentFrame.size.height -= bannerHeight;
        bannerOrigin.y -= bannerHeight;
    }
    else
    {
        bannerOrigin.y += bannerHeight;
    }
    
    CGFloat animationDuration = animated ? 0.2f : 0.0f;
    [UIView animateWithDuration:animationDuration animations:^{
        bannerView_.frame = CGRectMake(bannerOrigin.x,
                                       bannerOrigin.y,
                                       bannerView_.frame.size.width,
                                       bannerView_.frame.size.height);
    } completion:nil];
}

#pragma mark ADBannerViewDelegate methods

// バナーの読み込みが成功
-(void)bannerViewDidLoadAd:(ADBannerView *)banner
{
    [self layoutForCurrentOrientation:YES];
}

// バナーの読み込みが失敗
-(void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
{
    [self layoutForCurrentOrientation:YES];
}

// ユーザーが ADBannerView をクリックした際 (ゲームをポーズする処理など)
-(BOOL)bannerViewActionShouldBegin:(ADBannerView *)banner willLeaveApplication:(BOOL)willLeave
{
    return YES;
}

// ユーザーが iAd のなかから返ってきたとき (ゲームの画面を復帰する処理など)
-(void)bannerViewActionDidFinish:(ADBannerView *)banner
{
}

@end