酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

9月30日に終了してしまうAdWhirlの応急処置をおこなう (iOS編)

まず最初にAdWhirlの紹介から。

iOS/Android向けのアドネットワーク(スマートフォンの広告提供元)は沢山あります。スマートフォン関連で最も賑やかな分野のひとつで、日々あるところが潰れて、またあるところが登場してきて、アドネットワーク自体の増減があったり、とあるところが1クリックあたりの単価が激減したりと、環境がコロコロ変わってしまいます。

アプリで対応しようとすると、状況が変わるたびにアップデートを出すという手が考えられます。この状況下で特定のアドネットワークを決め打ちで広告SDKを組み込んでしまうのは得策ではありません。ということで、状況の変化に応じてアドネットワークAの広告の掲載を止めてアドネットワークBの広告を表示させるということができたのが、AdWhirlというサービスでした。

AdWhirlが2013年9月30日にサービス終了してしまいます

そのAdWhirlが9月30日に終わってしまいます。

前々から予告はされていましたが、別件で多忙なのもあり具体的な対策がとれていませんでした。多忙を極めたプロジェクトが一段落して、盆休みを取ってゆるふわになっていた僕がですが、AdWhirlの終了が間近となり再び焦ってきました。

僕個人で出しているアプリに関しては暇を見つけて対策すればよいのですが、会社で出しているアプリに関しては下記のようなケースもあり、別のサービスへよっこいしょという訳にはいきません。

そんなAdmobは、つい先日当サイトでもお伝えした通り、TVで紹介されたアプリが突然垢バンされる事件のようなリスクから、一部開発者の中で恐れられています。

参考:

【垢バン】「深イイ話」に取り上げられたアプリがadmobアカウントを削除される

(自社広告しか配信していなかったアプリでも垢バンされたという開発者も中にはいるそうです…)

iOS7が目の前に迫っている状況もあり、可能であれば現状維持が好ましいと考えていますが、無くなるモノに対して現状維持は不可能……。さて、どうしたものか。

そんな折、「AdWhirl 応急対応 もっと簡単バージョン | フォー・フュージョン株式会社」を読みました。

結局AdWhirlの仕組みというのは、アプリへJSONを返してそのJSONにより挙動を変えているだけなのだ。

と書かれており、さらに下記のように続きます。

ちなみに、その他のPHPプログラムは用意しなくてよいのかというと 配信するだけなら、必要ない。その他のものは広告の表示回数とかを カウントしたりするためにあるので、それが必要なければ、いらないのだ。

な、なるほど!

さて、どう対策するのか?

結論から言えば「広告定義ファイルをサーバーに置いて参照するアドレスを変更する」です。

前述の通り、AdWhirlはJSONを返すだけというのが分かりました。AdWhirl SDKはどこで定義したアドレスを参照しているのでしょうか?検索するとすぐに分かりますが、AdWhirlView.h で定義されています。

#define kAdWhirlDefaultConfigURL @"http://mob.adwhirl.com/getInfo.php"
#define kAdWhirlDefaultImpMetricURL @"http://met.adwhirl.com/exmet.php"
#define kAdWhirlDefaultClickMetricURL @"http://met.adwhirl.com/exclick.php"
#define kAdWhirlDefaultCustomAdURL @"http://mob.adwhirl.com/custom.php"

このうち、「kAdWhirlDefaultConfigURL」にアクセスすることで広告を定義しているファイルを取得することができます。kAdWhirlDefaultConfigURLは、AdWhirlConfig.m で使用されています。

このアドレスからは以下のようなJSONが返ってきます。

{"extra":{"location_on":0,"background_color_rgb":{"red":255,"green":255,"blue":255,"alpha":1},"text_color_rgb":{"red":0,"green":0,"blue":0,"alpha":1},"cycle_time":30,"transition":8},"rations":[{"nid":"xxxxxxxx","type":17,"nname":"event","weight":100,"priority":1,"key":"Appbank Network|;|performEventAppBank"}]}

返ってきたJSONは、AdWhirlConfigStore.mの以下のメソッド内でパースされるようです。

 - (BOOL)parseConfig:(NSData *)data error:(NSError **)error

AdWhirlのソースコードを書き換える

先ほどのJSONをファイルに保存して、Amazon S3などのアクセスしやすい場所に保存します。説明の便宜上、以下のアドレスでアクセス可能な場所に置いたことにします。

https://example.com/bucket/ads_info.json

AdWhirlView.h

kAdWhirlDefaultConfigURLの定義を書き換えます。

// #define kAdWhirlDefaultConfigURL @"http://mob.adwhirl.com/getInfo.php"
#define kAdWhirlDefaultConfigURL @"https://example.com/bucket/ads_info.json"

AdWhirlConfig.m

AdWhirlは、広告定義ファイルを取得する際にアプリキーとAdWhirl SDKのバージョンを送信しています。直接JSONファイルへのアドレスを AdWhirlView.h で定義しているので不要なクエリをコメントアウトしてしまいましょう。

- (id)initWithAppKey:(NSString *)ak delegate:(id<AdWhirlConfigDelegate>)delegate {
  self = [super init];
  if (self != nil) {
    appKey = [[NSString alloc] initWithString:ak];
    legacy = NO;

    // 〜〜〜〜〜〜〜〜〜〜 省略 〜〜〜〜〜〜〜〜〜〜

    // config URL
    NSURL *configBaseURL = nil;
    if ([delegate respondsToSelector:@selector(adWhirlConfigURL)]) {
      configBaseURL = [delegate adWhirlConfigURL];
    }
    if (configBaseURL == nil) {
      configBaseURL = [NSURL URLWithString:kAdWhirlDefaultConfigURL];
    }
//    configURL = [[NSURL alloc] initWithString:[NSString stringWithFormat:@"?appid=%@&appver=%d&client=1",
//                                               appKey,
//                                               kAdWhirlAppVer]
//                                relativeToURL:configBaseURL];
    configURL = [configBaseURL retain];
  }
  return self;
}

以上でAdWhirlが死んでもとりあえず運用が続けられると思います。しかしこの状態はあまりよろしくないので早期に別のサービスに乗り換えた方が良いでしょう。