カテゴリー: 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)];

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