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を使うと非常に簡単にできてよさそうです。





