2011年2月25日金曜日

iAdをメインにしてAdmobをバックアップとして設置

とりあえず、かなり前にiAdの勉強がてら、リリースしたShot Clock Timer Freeだけど、iAdってとりあえず日本ではまだ始まってないし、スタートしてるアメリカとかでも表示率が100%ではない。なので、AdmobもしくはAdmobとのハイブリッドが理想型らしいけど、当時はAdmobの設置方法はちんぷんかんぷんだったので、ほったらかしてた。

最近ちょっとづつ分かってきたので、いろんなとこ調べながら、やってみました。

http://yayacocoa.blogspot.com/2010/11/iadadmob.html
http://xcodenoobies.blogspot.com/2011/01/how-to-integrate-iad-for-os32-and-admob.html

ここら辺りを参考に始めたけど、お世話になってる寺子屋サルできにて、よくわかるソースを発見!

iAdはOS4だけで動作するのでビルド設定に注意

コレを参考に、微妙に修正して組み込んでみました!

とりあえず、Admobの登録して、SDKをダウンロードして、

  • AdMob
  • TouchJSON

を組み込み。AdMobフォルダは


  • AdMobDelegateProtocol.h
  • AdMobView.h
  • libAdMob.a

だけでもいいみたいだけどよくわかんないんで全部ぶち込みました。そして、以下のフレームワークを追加。


  • AudioToolbox
  • CoreGraphics
  • MediaPlayer
  • MessageUI
  • QuartzCore
  • iAd

iAdはOS3.xをターゲットにするならiAdをweklinkにする必要あり。

で、Admobのサイトでパブリッシャーidをコピッてきて、

//========================================================
// publisher id
//========================================================
- (NSString *)publisherIdForAd:(AdMobView *)adView {
 return @"publisher id";
}

ここの「publisher id」に置き換え。で行けるはず。

あと、

//========================================================
// Admobテスト用設定 リリース時にはコメントアウト?
//========================================================
//*/
- (NSArray *)testDevices {
 return [NSArray arrayWithObjects:
   ADMOB_SIMULATOR_ID,      // Simulator
   @"Device identifier",    // Xオーガナイザで確認
   nil];
}
///*

ここの「Device identifier」にXcodeオーガナイザで確認できるDevice identifierを入れると、実機でもテスト広告が出る。ただし、Admobのサイトのアプリ設定で、テストモードを無効化してると、意味はない。

後は、コンソールをみながら、

iAd: Did load ad

でiAdのテスト広告が表示されて、


iAd: Did fail to receive ad

でAdmobの広告がでればOK!・・・かと思われる。
うまくいけば暫く待てばfailしてくれるが、もしかしたらずっとloadしてるとAdmobの確認ができないかもしれない・・・

ちなみにオリジナルからいじった所は、viewDidLoadのAdmobの部分で、起動時には一旦、hiddenをYESにして、moveBannerViewOffScreenの部分でNOにしたところです。
iAdの読み込みには少し時間がかかるみたいで、起動時にiAdもAdmobも両方取得成功したときに、広告表示が、Admob->iAdとばたついて表示されるのを防ぐためです。
ただ、一時も広告の非表示時間を減らしたくない場合は得策でない場合がありますね。
また、Admobメインで考えるなら、逆にしたほうがいいでしょう。

「...」はアプリそれぞれのコードが入っていることを表しています。

↓以下サンプルソース

*.h

...
#import <iAd/iAd.h>
#import "AdMobDelegateProtocol.h"
...
@interface viewController :UiViewController < ... , ADBannerViewDelegate, AdMobDelegate>{
...
AdMobView *adMobAd;
ADBannerView *bannerView;
...
}
...
- (void) moveBannerViewOnScreen;
- (void) moveBannerViewOffScreen;
...
@end


*.m
#import "viewController.h"
#import "AdMobView.h"
@implementation:viewController
...
//========================================================
// 起動時設定
//========================================================
- (void)viewDidLoad {
 ...
 //iAd(OS4.0以上)
 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 4.0) {
  bannerView = [[ADBannerView alloc] init];
  bannerView.delegate = self;
  [self.view addSubview:bannerView];
  [self moveBannerViewOffScreen];
 }
 //Admob
 adMobAd = [AdMobView requestAdWithDelegate:self];
 [adMobAd retain];
 adMobAd.hidden = YES;
 ...
}
//========================================================
// メモリ解放
//========================================================
- (void)dealloc {
 ...
 //Admob
 [adMobAd release];
 //iAd
 bannerView.delegate = nil;
 [bannerView release];
 ...
}
...
...
...
...
#pragma mark iAd,Admob
//**********************************************************
// iAd⇔Admob切り替え
//**********************************************************
//========================================================
// iAd広告表示
//========================================================
- (void) moveBannerViewOnScreen {
 //Admob広告を隠す
 if (adMobAd != nil) {
  if (adMobAd.frame.origin.y == self.view.frame.size.height -48) {
   CGRect frame = self.view.frame;
   adMobAd.frame = CGRectMake(0, frame.size.height, frame.size.width, 48);
  }
 }
  //iAd広告を表示
 CGRect newBannerView = self.view.frame;
 newBannerView.origin.y = self.view.frame.size.height - bannerView.frame.size.height;
 [UIView beginAnimations:@"BannerViewIntro" context:NULL];
 bannerView.frame = newBannerView;
 [UIView commitAnimations];
}
//========================================================
// iAd広告非表示
//========================================================
- (void) moveBannerViewOffScreen {
 //iAd広告を隠す
 CGRect newBannerView = self.view.frame;
 newBannerView.origin.y = self.view.frame.size.height;
 bannerView.frame = newBannerView;
  //Admob広告を表示
  adMobAd.hidden = NO;
 if (adMobAd != nil) {
  if (adMobAd.frame.origin.y == self.view.frame.size.height) {
   CGRect frame = self.view.frame;
   [UIView beginAnimations:@"AdMobBanner" context:NULL];
   adMobAd.frame = CGRectMake(0, frame.size.height - 48, frame.size.width, 48);
   [UIView commitAnimations];
  }
 }
}
//**********************************************************
// iAd関連
//**********************************************************
//========================================================
// iAD広告取得成功時
//========================================================
- (void)bannerViewDidLoadAd:(ADBannerView *)banner{
 NSLog(@"iAd: Did load ad");
 //Admob広告非表示->iAd広告表示
 [self moveBannerViewOnScreen];
}
//========================================================
// iAD広告取得失敗時
//========================================================
- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error{
 NSLog(@"iAd: Did fail to receive ad");
 //iAd広告非表示->Admob広告表示
 [self moveBannerViewOffScreen] ;
}
//**********************************************************
// Admob関連
//**********************************************************
//========================================================
// publisher id
//========================================================
- (NSString *)publisherIdForAd:(AdMobView *)adView {
  return @"publisher id";
}
//========================================================
// current view controller
//========================================================
- (UIViewController *)currentViewControllerForAd:(AdMobView *)adView {
 return self;
}
//========================================================
// Admob広告取得成功時
//========================================================
- (void)didReceiveAd:(AdMobView *)adView {
 NSLog(@"Admob: Did receive ad");
 CGRect frame = self.view.frame;
 adMobAd.frame = CGRectMake(0, frame.size.height, frame.size.width, 48);
 [self.view addSubview:adMobAd];
 [UIView beginAnimations:@"AdMobBannerstart" context:NULL];
 adMobAd.frame = CGRectMake(0, frame.size.height - 48, frame.size.width, 48);
 [UIView commitAnimations];
}
//========================================================
// Admob広告取得失敗時
//========================================================
- (void)didFailToReceiveAd:(AdMobView *)adView {
 NSLog(@"Admob: Did fail receive ad");
 [adMobAd removeFromSuperview];
 [adMobAd release];
 adMobAd = nil;
}
//========================================================
// Admobテスト用設定 リリース時にはコメントアウト?
//========================================================
//*/
- (NSArray *)testDevices {
 return [NSArray arrayWithObjects:
 ADMOB_SIMULATOR_ID,           // Simulator
 //@"Device identifier",       // Xオーガナイザで確認
 nil];
 }
///*
...
...
...
...
@end

0 件のコメント:

コメントを投稿