2011年 10月 01日(土曜日) 22:03

AdWhirlでiAdとAdMobを切り替えて表示する方法

評価:
(0 票)

AdWhirlを使って、iPhoneアプリに表示する広告のネットワークを、iAdとAdMobを切り替えられるようにしました。

AdWhirlは、AdMob、iAd、InMobiなど、複数の広告ネットワークから広告を取得して表示するためのオープンソースのツールです。AdMobによって管理されています。

これをつかって、iAdとAdMobを切り替えて表示する実装を試してみました。

1.AdWhirlに登録・アプリケーション登録

AdWhirlのサイトにアクセスし、"Get Started"をクリックして新規登録します。

登録が完了したら、ログインして、"Add Application"をクリックしてアプリケーションを追加します。

iAdの設定にはApple IDを、AdMobの設定にはPublisherIDを設定します。"AdServicing"をONにするのも忘れずに。

2.AdWhirl iOS SDKをダウンロード

AdWhirlはオープンソースのプロジェクトで、Google Codeにソースコードが公開されています。こちらからiOS用のSDKをダウンロードします。(これを書いている現在のバージョンではAdWhirlSDK_iPhone_3.0.0.zip)

3.AdWhirl iOS SDKをプロジェクトに追加

以下は、AdWhirlのドキュメントに従えば大丈夫です。

まず、ダウンロードしたZIPファイルの中にある"AdWhirl"と"TouchJSON"フォルダを、Xcodeのプロジェクトにドラッグ&ドロップして、ソースをコピーします。

4.広告プロバイダのSDKを追加

AdWhirlを使用しても、広告プロバイダが提供するSDKはプロジェクトに追加しなければなりません。

iAdはiAd.frameworkにビルトインされているので、特にSDK追加の必要はありません。AdMobのSDKをまだ追加していない場合は、こちらからダウンロードして追加します。

5.Frameworksの追加

Xcodeで、Adネットワークで必要なフレームワークを追加します。

必要なフレームワークはAdネットワーク毎に異なりますが、iAdの場合は、

  • iAd
  • QuartzCore
  • SystemConfiguration

AdMobは、

  • AudioToolbox
  • MessageUI
  • SystemConfiguration
  • CoreGraphics

が必要です。

Xcode4では、ターゲットの設定で、"Build Phases"の"Link Binary With Libraries"の+ボタンを押してフレームワークを追加します。

ここで、iAdやMessageUIなど、iOS4以上でしかサポートされていないフレームワークを追加する場合、もしiOS Deployment TargetをiOS4よりも前のバージョンにしていた場合、アプリがクラッシュすることになります。その場合は、"Link Binary With Libraries"の右側にある"Required"を"Optional"に変えておくことで、Weak Linkにすることができ、フレームワークがない場合でも単にそれに依存する広告が表示されなくなるだけで、クラッシュを防ぐことができます。

6.不要なAdネットワークのアダプタを削除

"AdWhirl"フォルダの中に、"adapters"というフォルダがあり、その中にはそれぞれのAdネットワークに対応するObjective-Cクラスファイルとヘッダファイルがあります。使用しないネットワークのソースファイルは、XcodeのTarget Membershipのチェックを外すか、ファイルへのリンクをプロジェクトから削除するか、またはファイル自体を削除して除外します。

ここでは、iAdとAdMobのソースとヘッダファイル計4つと、AdWhirlAdNetworkAdapter.hを残して全てファイルを削除しました。

7.AdWhirlViewを追加

いよいよ、AdWhirlをアプリのコードに追加していきます。まず、広告を表示したいViewのViewControllerのヘッダファイルに、

#import "AdWhirlView.h"

を追加します。また、ViewControllerクラスを、AdWhirlDelegate実装クラスとして宣言しておきます。

@interface SomeViewController : UIViewController <adwhirldelegate> {

次に、ViewControllerのviewDidLoadなどに、次の2行を追加してAdWhirlViewをどこかのViewに追加します。

    AdWhirlView *adWhirlView = [AdWhirlView requestAdWhirlViewWithDelegate:self];
    [self.view addSubview:adWhirlView];

最後に、AdWhirlのドキュメントにも描かれている2つのデリゲートメソッドを実装します。

- (NSString *)adWhirlApplicationKey {
    return @"(AdWhirlのアプリの設定画面の上の方に描かれているSDK Keyを返す)";
}

- (UIViewController *)viewControllerForPresentingModalView {
    return self;
}

8.広告の位置を調整するコードを追加

iAdとAdMobだけを使う場合、どちらも広告のサイズは320x50なはずなので、基本的にこれは必須ではないのですが、広告プロバイダによっては広告のサイズが異なるので、実際に取得した広告のサイズを見て、広告の位置を調整するコードをadWhirlDidReceiveAd:に追加します。

- (void)adWhirlDidReceiveAd:(AdWhirlView *)adWhirlView {
    [UIView beginAnimations:@"AdWhirlDelegate.adWhirlDidReceiveAd:" context:nil];
    
    [UIView setAnimationDuration:0.7];
    
    CGSize adSize = [adWhirlView actualAdSize];
    CGRect newFrame = adWhirlView.frame;
    
    newFrame.size = adSize;
    newFrame.origin.x = (adContainer.bounds.size.width - adSize.width) / 2;
    newFrame.origin.y = (adContainer.bounds.size.height - adSize.height) / 2;
    
    adWhirlView.frame = newFrame;
    
    [UIView commitAnimations];
}

以上で、実装は完了です。ビルドして、実機でテストして広告が表示されればとりあえず成功です。何も表示されない場合は、AdWhirlのWeb上の設定で、使用するプロバイダがONになっているか確認してみましょう。ONにしたばかりの時は、しばらく待たないと実際に広告が表示されないこともあるようですので、その場合は少し時間を置いてテストしてみましょう。

9.広告の優先順位を変えるには?

AdWhirlの特徴の一つは、どの広告プロバイダからの広告をどれぐらいの割合で表示させるかを指定することができる点です。

指定できるのは、"% of Traffic"と"Backfill Priority"の2種類があります。これらの違いがはじめは分かりづらいのですが、AdWhirlのヘルプを見ると、このように書かれていました。

For a deeper understanding, allocation percentages tell AdWhirl where to send ad requests on the first try. If an ad request to a given network fails, your Backfill Priorities will kick in, and AdWhirl will filter the ad request down to each network on your list.
Even if a network has a 0% allocation, it may still get some requests through backfill. To ensure that no ad requests ever go to a network, make sure to switch it off using the On-Off button.

つまり、はじめに広告のリクエストを受けたときは、"% of Traffic"で指定された割合で広告プロバイダが選出され、その広告プロバイダが広告を表示させることが可能である場合はそれを、そうでない場合はBackfill Priorityの設定に従って、上位のプロバイダから順次リクエストしていくということのようです。

なので、"% of Traffic"で0と指定しても、それは最初にリクエストを受けたときには使わないけれど、最初のリクエストで広告が表示されなかった場合には、Backfill Priorityの順に従って表示される可能性があるということです。

ここでは、iAdとAdMobに優先順位を付けてみます。iAdは広告が取得できる可能性が今のところは非常に低いようですが、クリック単価がとても高い上、インプレッションだけでも収益が発生します。一方、AdMobは、AdSenseの広告も表示されるようになった頃から、広告表示率が99%以上と格段に高くなりましたが、単価が非常に低いです。

なので優先順位を付ける場合は、最初のリクエストではまずiAdを表示させようとしてみて、ダメならAdMobを表示するという感じにしたいところです。この場合、上の解説に従えば、"% of Traffic"はiAdを100%、AdMobを0%に指定すればよいはずなのですが・・・

こうすると、iOS3でBackfillに指定した広告が表示されないという問題が発生しました。

そこで、ワークアラウンドとして、上のチケットに書かれていたように、iAdを99%、AdMobを1%にしてみたら、無事iOS3でも表示されました。理想的ではないですが、実質ほとんど変わらないのでこれでよしとしましょう。

 

以上、AdWhirlを使ってiAdとAdMobを切り替えて表示する方法でした。特にiAdは自分で実装するのにいろいろとややこしそうなので、AdWhirlを使うと非常に簡単にできてよさそうです。

最終更新日: 2011年 10月 04日(火曜日) 17:57
くらち たかよし

くらち たかよし

モバイル・Webアプリ作家。最近は主にiPhoneアプリ制作を手がける。企画、UIデザイン、設計、実装、テストなどを1人〜数人の個人で行う全人的開発手法の確立を目指している。

使う言語はObjective-C, C++, C#, Java, PHPなど。Web関連で使うものはCakePHP, MySQL, Joomla! CMSなど。デザインではPhotoshopとIllustratorをかろうじて使う。

場所や時間に縛られない、インターネット時代の新しい働き方、自由な生き方を模索中。海外移住、低予算&低リスク起業、キャリアデザイン、心理学などにも興味あり。

Web: awaresoft.jp/