iAdが表示されない間自社広告を表示する

| コメント(0) | トラックバック(0)
こんにちは。開発担当のICTFです。

iAdのガイドラインに「広告が表示中でない間、広告ビューを隠す事」とありますが、隠している間その領域に何を表示しようか悩んだ事は無いでしょうか。
広告が表示されるまでの間、作業領域を大きくとるというのが理想的なのかもしれませんが、その為(広告が表示されない間)だけの実装と考えるとかなり面倒です。

一案として、iAd非表示中は自社広告を変わりに表示するのは如何でしょうか。
常に広告枠に何かしら表示されている状態にしておけば、iAdの表示状態を気にする必要はありません。今回はそんなiAdビュークラスを実装します。

実装するiAdビューの仕様は次の通りです。
  • iAdビューを貼付けるだけ(通常のADBannerViewクラスと同じ扱い)で自社広告の表示を行なう。
  • iAd非表示中は自社広告を表示し、iAd表示中は自社広告を表示しない。
  • 自社広告をタップすることで、対象のAppStoreリンクに遷移する。
まずiAdと同じ大きさのバナーを作ります。
iPhoneは320x50、iPadは768x66となります。Retina対応する場合はそれぞれ2倍のサイズも用意して下さい。
ICTF_Ad320.png
自社広告ビュークラス(ICTF_AdView)を作ります。
サンプルでは単に画像を表示するだけのクラスですので、必要なければUIImageViewに画像を設定するだけで構いません。
【ICTF_AdView.h】

// 自社広告クラス

@interface ICTF_AdView : UIImageView

{

}


@end


【ICTF_AdView.m】

@implementation ICTF_AdView


-(id) init

{

CGRect frame;

if ([CommonFunctions isiPad]) {

frame = CGRectMake(0, 0, 768, 66);

}

else {

frame = CGRectMake(0, 0, 320, 50);

}

if (self = [super initWithFrame:frame]) {

if ([CommonFunctions isiPad]) {

self.image = [UIImage imageNamed:@"ICTF_Ad768.png"];

}

else {

self.image = [UIImage imageNamed:@"ICTF_Ad320.png"];

}

}

return self;

}


@end


[CommonFunctions isiPad]はデバイスがiPadであるかを調べる為の自作メソッドです。
iPadであればYESを返します。

ADBannerViewを継承したADBannerViewExクラスを作ります。
【ADBannerViewEx.h】

#import <iAd/iAd.h>

#import "ICTF_AdView.h"


// 自社広告表示機能を追加したiAdビュー

@interface ADBannerViewEx : ADBannerView

<ADBannerViewDelegate>

{

ICTF_AdView* _ictfAdView;

UITapGestureRecognizer* _ictfAdTapGesture;

}


@end


【ADBannerViewEx.m】

@interface ADBannerViewEx ()


// 自社広告のタップイベント

-(void) adIctfAdTapHandle:(UITapGestureRecognizer*)sender;


// 自社広告のタップイベント追加

-(void) addIctfAdTapGesture;


// 自社広告のタップイベント削除

-(void) removeIctfAdTapGesture;


@end


@implementation ADBannerViewEx


-(id) initWithAdType:(ADAdType)type

{

if (self = [super initWithAdType:type]) {

self.delegate = self;

_ictfAdTapGesture = nil;

// 自社広告を追加

_ictfAdView = [[ICTF_AdView alloc] init];

[self addSubview:_ictfAdView];

_ictfAdView.center = CGPointMake(self.bounds.size.width * 0.5, self.bounds.size.height * 0.5);

[self addIctfAdTapGesture];

}

return self;

}


-(void) dealloc

{

[_ictfAdView release];

[super dealloc];

}


// iAdの読み込み完了通知

- (void)bannerViewDidLoadAd:(ADBannerView *)banner

{

NSLog(@"iAd読み込み完了");

_ictfAdView.hidden = YES;

[self removeIctfAdTapGesture];

}


// iAdの読み込み失敗通知

-(void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error

{

NSLog(@"iAd読み込み失敗: %@",error);

_ictfAdView.hidden = NO;

[self addIctfAdTapGesture];

}


// 自社広告のタップイベント

-(void) adIctfAdTapHandle:(UITapGestureRecognizer*)sender

{

// AppStoreを開く

NSURL* url = [NSURL URLWithString:@"http://itunes.apple.com/jp/app/mono-calculator/id517496688?mt=8"];

UIApplication* application = [UIApplication sharedApplication];

if ([application canOpenURL:url]) {

[application openURL:url];

}

}


// 自社広告のタップイベント追加

-(void) addIctfAdTapGesture

{

if (_ictfAdTapGesture == nil) {

_ictfAdTapGesture = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(adIctfAdTapHandle:)] autorelease];

_ictfAdTapGesture.numberOfTapsRequired = 1;

[self addGestureRecognizer:_ictfAdTapGesture];

}

}


// 自社広告のタップイベント削除

-(void) removeIctfAdTapGesture

{

[self removeGestureRecognizer:_ictfAdTapGesture];

_ictfAdTapGesture = nil;

}


@end


自社広告をiAdビューの上に被せるように配置しています。
iAdの読み込み通知を受けたタイミングで、自社広告の表示・非表示を切換えます。
UITapGestureRecognizerをADBannerViewに追加する事で、iAdのタップイベントを乗っ取っています。
iAd表示後もタップイベントを乗っ取ったままだとまずいので、iAdの表示通知を受けてUITapRecognizerを解放しています。

ADBannerViewのDelegateをselfに設定していますので、広告表示側のViewControllerなどに特別な処理を実装したい場合、別に通知処理を用意する必要があります。

最後に実装の注意事項となりますが、最初UITapGestureRecognizerを自社広告ビュー(ICTF_AdView)に設定していました。
しかしその方法で実装した場合、ADBannerViewに自社広告ビューをaddSubViewしていてもタッチイベントが受け取れませんでした。
ADBannerViewのタッチイベントが優先されるようです。

ADBannerViewExの使い方はADBannerViewとまったく同じです。

adView = [[ADBannerViewEx alloc] initWithAdType:ADAdTypeBanner];


トラックバック(0)

トラックバックURL: http://www.ict-fractal.com/MovableType/mt/mt-tb.cgi/49

コメントする

Twitterボタン
Twitterブログパーツ