カテゴリー : iPhone関連のプログラム

AdwhirlのadWhirlDidReceiveAdはCustom Eventには効かない?



Adwhirlを入れてはや1ヶ月くらい経ちました。

現在入れているのはiAd、Admob、Admakerの3つですが、iAdはあまりにも効果が少なかったため、その分の通信時間がおしかったので非表示にしてあります。そのため実質AdmobとAdmakerの2つですね。

で、私は広告が表示されていないときは広告のビュー自体を透明化(なんたら.view.alpha = 0.0;)していて、広告を受信したタイミングで透明化をオフにしている(なんたら.view.alpha = 1.0;)のですが、なぜかAdmakerではこれがうまくいかない。Admobではちゃんと動いているのに。

というわけでいろいろ試してみたところ、広告が受信されたタイミングで実行されるAdwhrlの関数である「adWhirlDidReceiveAd」が、Admakerでは実行されていない感じでした。Admobではちゃんと実行されるので、もしかしたらユーザー側で追加した「Custom Event」では「adWhirlDidReceiveAd」関数は呼ばれないのかもしれません。

というわけでしょうがないから下記のようにAdmaker側の広告を受信したタイミングで実行される「didLodAdMakerView」関数の中で不透明化(なんたら.view.alpha = 1.0;)を実行させることで対応しました。

ソースの一部は下記のとおり。

- (void)viewDidLoad {
	[super viewDidLoad];	
	
	// 以下、Admaker-----------------
	AdMaker = [[AdMakerView alloc] init];
	[AdMaker setAdMakerDelegate:self];
	[AdMaker setFrame:CGRectMake(0, 0, 320, 50)];
	[AdMaker start];

	// 広告が受信されるまではAdmakerの広告枠自体を非表示
	AdMaker.view.alpha = 0.0;
	// 以上、Admaker-----------------
	
	//adwirl
	[super viewDidLoad];
	
	self.awView = [AdWhirlView requestAdWhirlViewWithDelegate:self];
	[self.view addSubview:awView];
	
	awView.frame = CGRectMake(0.0, self.view.frame.size.height - 
							   GAD_SIZE_320x50.height - 44,GAD_SIZE_320x50.width, GAD_SIZE_320x50.height);
	
	awView.delegate = self;
	awView.alpha = 0.0;	
}

// Adwhirl側の広告受信時に実行される関数
- (void)adWhirlDidReceiveAd:(AdWhirlView *)adWhirlView{
	// Admobは広告受信時のこの関数が実行されるが、Admakerはなぜか実行されない
	awView.alpha = 1.0;
}

// AdMaker側の広告受信時に実行される関数
- (void)didLoadAdMakerView:(AdMakerView*)view{
	// しょうがないのでAdmaker側に「awView.alpha = 1.0;」を追加
	AdMaker.view.alpha = 1.0;
	awView.alpha = 1.0;
}

AdwhirlにCustom EventとしてAdmakerを組み込む方法



前回の記事(iPhoneアプリにAdwhirlを設置してiAdとAdmobを切り替える方法)でAdwhirlにAdmobとiAdを組み込みました。

今回は、国内のスマートフォン広告の一つAdmakerをAdwhirlへ組み込む方法をご説明します。しかし、AdLantisやAMoAd、AppBank Networkなども同じ手順でできます。
なお、前回の記事で説明した内容を既に設定済みであることを前提に説明してありますので、まずは前回の記事をご覧ください。


1、Admakerにアプリの登録をする

まず、アプリをAdmakerに登録します。
AdmakerはAdmobと違い、アプリを登録をしてから審査があります。審査期間は長くて1週間くらいだったと思うので、なるべく早く済ましておきましょう。


2、Adwhirl管理画面でAdmakerをCustom Eventとして設定する

Adwhirlへログインし、Admakerを組み込みたいアプリを選択します。
アプリの管理画面が表示されるので、「Add Custom Event」を選択し、下記のように項目を入力してください。

Name:Admaker
Function Name:performEventAdMaker



3、Admakerの設定をする

AdmakerからダウンロードできるSDKの中にinstall.pdfという説明資料が入っているので、そちらを参考にコードやファイルを追加してください。


4、performEventAdMakerのコードを書く

下記のコードをビューコントローラーの.mにコピペしてください。
- (void)performEventAdMaker:(AdWhirlView *)adWhirlView {
   [AdMaker setFrame:kAdWhirlViewDefaultFrame];
   [adWhirlView replaceBannerViewWith:AdMaker.view];
}


5、Admakerのコードの一部を変更する

上記のperformEventAdMakerを使うことで、Adwhirl側で広告の表示を管理します。そのためAdmaker側の広告表示プログラムは使わないの下記の部分をコメントアウトします。


//広告の取得に成功
- (void)didLoadAdMakerView:(AdMakerView*)view {
// 下記をコメントアウトにする
//[self.view addSubview:AdMaker.view];
}

これですべての作業は完了です。


まとめ

ここではAdmakerを組み込みましたが、AdLantisやAppBank Network、AMoAdなども同じような感じでいけますので、もしそちらも組み込みたい場合はやってみてください。
広告ネットワークの比較はこちらの記事で紹介しています。

なお、上記のAdmakerをAdwhirlに組み込む方法は、パンダアプリなどの人気アプリを開発されているムラモトタケシ様から教えて頂いた内容を私の方で少し改変したものです(AdmakerSDKがバージョンアップしたため改変が必要になった)。

ムラモト様、とても親切に教えていただき本当にありがとうございました!ムラモト様の開発された人気楽器アプリ「パンダピアノ」やパズルアプリ「iMake10」などはこちら

※なお、ムラモト様に教えて頂いた時点で問題なくAdmakerの表示が確認できているため、今回の記事で紹介したコードを試してAdmakerが表示されない場合、完全に私のミスです。

もし表示されない場合はご連絡くださいませ。

【iOS+Object-Cメモ】SystemSoundIDとAudio Queue Servicesで音を鳴らす



iPhoneで音を鳴らすには少なくとも2つ方法があります(3つあった気もするけどあと1つ忘れた)。

1つはSystemSoundIDを使う方法、もう1つはAudio Queue Servicesを使う方法です。
それぞれに特性や使い方が違うので、1つずつ見て行きましょう。

SystemSoundIDの特徴と使い方


○特徴
  • 設置が比較的カンタン
  • 30秒以内の音しか鳴らせない
  • 音をループさせることはできない
  • ネットワーク通信を行うアプリで使用すると、音量がiPhone本体の左ボタンで調節できなくなる

○使い方
// ヘッダーファイル
@interface hogeViewController {
	SystemSoundID soundID;
}

- (IBAction)sounds01;

// 実装ファイル
@implementation hogeViewController

- (IBAction)sounds01 {
	
	NSString *path = [[NSBundle mainBundle]pathForResource:@"1" ofType:@"caf"];
	NSURL *url = [NSURL fileURLWithPath:path];
	AudioServicesCreateSystemSoundID((CFURLRef)url, &soundID);
	
	//サウンドを鳴らす
	AudioServicesPlaySystemSound(soundID);
}

// あとはInterface builderでボタンなどに対してsounds01をActionとしてひもづける
// 必要なフレームワークはAudioToolbox.framework 

○コメント
とってもシンプルなSystemSoundIDですが、いろいろと制約があるので使いにくい場面があるかもしれません。
そんなときは次のAudio Queue Servicesを使いましょう。


Audio Queue Servicesの特徴と使い方

○特徴
  • 30秒以上の音でも鳴らせる
  • 音のループが可能
  • SystemSoundIDよりちょっぴり重たいかも?

○使い方
// ヘッダーファイル
@interface hogeViewController {
	AVAudioPlayer *player;
}
@property (nonatomic, retain) AVAudioPlayer *player;

- (IBAction)sounds01;

// 実装ファイル
@implementation hogeViewController

@synthesize player;

- (IBAction)sounds01 {
	
	NSString *path;
	NSURL *url;
	
	path = [[NSBundle mainBundle] pathForResource:@"0_1" ofType:@"caf"];
	url = [NSURL fileURLWithPath:path];
	self.newPlay = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
	
	// ここでループの回数を指定する。無限の場合はマイナスの数値を指定。
	self.newPlay.numberOfLoops = 0;
	self.player = self.newPlay;

	//サウンドを鳴らす	
	[self.player play];
}

// 必要なフレームワークはAVFoundation.framework

○コメント
ループの回数等も指定できるので、通常はSystemSoundIDではなくこちらを使うべきだと思います。
SystemSoundIDだとAdmob広告などを表示させるだけで、ネットワーク通信を使うので音量調節ができなくなりますしね。

iPhone4などのRetinaディスプレイでsetNeedDisplayを使うと重くなる場合の対処



お絵描きアプリで線などを描画するとき、通常setNeedDisplayを使うと思います。

iPhone3GやiPhone3GSなどではスラスラ描画できるのですが、Retinaディスプレイのデバイスで試すと、やたら描画が遅れて線がカクカクしてしまうことがあります。

これはsetNeedDisplayで画面全体を再読み込みしていることが原因です。つまり、touchesMovedで呼び出している場合、指で画面をドラッグするたびに画面全体が何度も何度も読み込まれるので、処理が追いつかなくなりわけです。

こういう場合はsetNeedsDisplayInRectを使います。これは画面のうち必要な部分だけを再読み込みするもので、読み込まれる部分が少ないのでその分処理が早くなります。

使い方はこんな感じ。

[self setNeedsDisplayInRect:CGRectMake(読み込む部分の開始位置x軸, 読み込む部分の開始位置y軸, 読み込むサイズx軸, 読み込むサイズy軸)];

最初の2つで読み込みの開始位置を指定し、後の2つで読みこむサイズを指定します。

1点だけ注意が必要なのが、読み込みの開始位置は線の半径分をマイナスしなくてはいけません。
つまり、線は指でさわった点を中心点としてそこから半径のサイズに描画するため、読み込みの開始位置も半径分マイナスするわけです。

たとえば、CGContextSetLineWidthで線の太さを200にした場合、開始位置は半径の分の100を引いた数値を指定します。
[self setNeedsDisplayInRect:CGRectMake(currentPoint.x - 100, currentPoint.y - 100, 200, 200)];

これで処理が少し早くなります。ただ、あまりにも読み込むサイズが小さいと素早くかつ広い範囲で線を描画したときに線が読み込む範囲を超えてしまい、うまく描画できなくなるのでそこは数値を変えてチェックを繰り返して試してみてください。

iPhoneに入れる広告の種類について


先週末から、iPhoneアプリに入れていたAdmobの広告収入が激減しました。
調べてみると、私だけでなく他の開発者様も軒並み広告収入が減っているようで、これを機に他の広告会社へ乗り換えようとしている人も多いようです。

日本ではAdmobとAdmakerが有名ですが、広告会社はそれぞれ一長一短あるので、どこの広告を入れたらよいのか分からないことも多いと思うので、私が分かる範囲で各社の違いを紹介します。

日本の開発者がよく入れている広告

iAd

Appleが提供している広告。クリック単価が高いのが魅力だが、残念ながら日本の広告はまだ未対応。
しかし、海外ではちゃんと表示されるので、海外のユーザーがターゲットのアプリは入れてみるとよい。
ちなみに、日本では未対応だが今年中に電通と組んでリリースされるらしい。

Admob

グーグルの子会社でモバイル広告最大手。以前はドキュメント(説明書)に間違いが多く導入に手間がかかったが、2011年3月のバージョンで導入はカンタンになった。
広告表示率がとても低いのが最大の弱点。

Admaker

日本の企業が提供する広告。日本の広告は多く広告表示率が高い。
以前は管理画面がなかったり広告の内容が悪かったらしいが、今は管理画面もあり広告の内容も改善されているらしい。

どの広告を入れるべきか

海外のユーザーをターゲットにしている人は、iAdかAdmobを入れればよいと思います。初めてでよく分からない人はAdmobがオススメです。
国内のユーザーをターゲットにしている人は、Admakerを入れれば広告表示率もほぼ100%ですし安心かと思います。

すべての広告を入れ、表示する広告をWeb上で切り替える方法

上記3つから1つの広告サービスを選ぶのではなく、全ての広告を表示させることもできます。
つまり、iAdが表示されなかったらAdmobを表示し、Admobも表示されない場合はAdmakerを表示する・・・という流れです。

この機能を自分で実装することもできますが、そういった複数広告切り替えサービスを提供している企業がありますので、そちらを利用した方が早いと思います。

広告切り替えサービスを提供しているのは、現在私が知っている範囲では3つです。
Adwhirl
Admaker(2011年3月広告切り替えサービス停止)
Smadd

前述のとおり、私は今までAdmob一本で広告展開をしたせいで今回収入が激減したので、上記の切り替えサービスをアプリに組み込んでみようと思います。
私が導入するのはAdmobの子会社が提供しているAdwhirlです。
「導入がけっこう大変」とAdmakerの方はおっしゃっていたので、いろいろ手間取るかもしれませんが、その軌跡をブログで公開してこれから導入を検討している方のお役に立てれば幸いです。

というわけで、私はiAD→Admaker or Admob を実現しようと思います。
次回からはAdwhirlの導入方法についてご紹介します。

次の記事、iPhoneアプリにAdwhirlを設置してiAdとAdmobを切り替える方法はこちら