エモンのブログ(スマホアプリ作成日記) -9ページ目

エモンのブログ(スマホアプリ作成日記)

エモンのブログです。

GooglePlayとAppStoreにアプリをリリースしてます。
「詰将棋パラダイス」4500問無料で公開。
「みんなのしょうぎ」投票型の将棋対局。いずれもソーシャルアプリなので、ソーシャルゲーム作成に興味があるかたは是非ご覧ください。

インストーラーが正しく構成されていないのでアプリケーションをインストールできませんでした。アプリケーションの作成者にお問い合わせください。

と出た場合の対処方法。
flaファイルと証明書をコピーして別名にして作り直す。以上。
以前のエントリーでAIRで広告を表示する件を書きましたが、色々調査した結果変更したほうが良さそうです。
AIRアプリに広告をのせる方法

広告会社とメディエーションについて
まず契約した広告会社ですが以下の通り
imobile, nend, mediba, アスタ, アップバンクnetwork, Geniee, inmobi, ADsee!, ADTUNE, amoad
広告の種類が多ければ多いほど有利ですね。
AD-STA, アドカボがなくなり、amoadの単価が0.5円になったり、admobがアプリだけになったりと色々なことがあるので
メディエーション(広告の出し分け)したほうがいいでしょう。
特にadmobとは連絡が取れて、動作確認までしてもらったんですけど・・・残念です。
しかも自分のサーバでメディエーションしたほうが、無効クリックの検知率が低くなりそうな予感がします。
※無効クリックは検知されたほうがいいんでしょうけど。

広告パターン
色々な広告会社があり、表示方法や広告リンク先の挙動なども異なります。
AIRで表示させる場合はすべてwebview表示になりますが、webでの表示は以下の5パターンに分かれると思われます。
・直リンク広告
・iTunesへの直リンク広告
・iTunesへのブラウザ経由のリンク広告
・iTunesへのサーバ経由のリンク広告
・枠の表示と内容の表示が別々の広告

iTunesへのリンクが分かれているのは
iTunesへのリンクするときにリダイレクトループになり結局画面遷移できない場合があるからです。
なので、工夫としてブラウザのJS経由でリンクさせたり、サーバでリダイレクト(フォワードということ)させます。
WEBではなく、ネイティブの機能が使えるならインテントさせるのですが、webviewなので面倒なことになってます。
まあ直リンクは今時ありえないでしょう。直リンクをすると広告の種類を増やすという意味では動的に増やせないのでマイナスもいいところですね。

AIRで広告表示のおさらい
AIRで広告表示するにはStageWebViewを使います。
広告会社からもらったタグをhtmlファイルにしてサーバにUPしておきます。
そしてAIR内部からそのhtmlを見るようにします。
AIR内でLOCATION_CHANGEイベントを登録しておいて、webview内で画面遷移があったときにNavigametoURLする感じです。
LOCATION_CHANGEイベントはwebview内の画面遷移「後」に発生します。
LOCATION_CHANGINGイベントはwebview内の画面遷移「前」に発生します。

iOSでリンクされてない?
前回記事のまま実装をするとiOSでリンクできない場合があります。
どうやらiTunesへのサーバ経由のリンクでおこります。リダイレクトループされて画面遷移しなくなっているようです。
これだけを修正するのであるならば、リスナーLocationChangeEvent.LOCATION_CHANGEを登録するところで
LocationChangeEvent.LOCATION_CHANGINGにすれば解決します。
しかし「枠の表示と内容の表示が別々の広告タイプ」の場合にこれをやってしまうと
広告が表示された瞬間にイベントを検知してリダイレクトされてしまいます。これはさすがにヤバいので回避せねばなりません。
このタイプの広告は、枠と内容両方表示後ならばユーザがタッチしない限りイベントを検知しないため、広告表示から1秒後にLocationChangeEvent.LOCATION_CHANGINGを登録するという方法を取りました。
またLOCATION_CHANGINGを登録したタイミングで広告表示の切り替えをした場合、やはり広告が表示された瞬間にイベントを検知してしまうので
adCntというフラグを用意してイベント登録されているときに改めて広告表示させることを回避しています。
わかりやすく言うと、1秒以内に複数回広告表示させるようなことがあると結局広告が表示された瞬間にリダイレクトしちゃうのです。

結果
最終的にこうなりました。LocationChangeEvent.LOCATION_CHANGEはいらないかもしれませんね。保険かわりに入れてます。入れるのは無料ですから。
前回のASコードに修正を入れます。
前回のASコードはコチラAIRアプリに広告をのせる方法

var webView:StageWebView = new StageWebView();
var url:String = "http://www.XXXXXXXXX";//広告のURL。ここにはhtmlの割り振りプログラムが書いてある。
--
public function displayAd() {
this.webView.stage = this.stage;
this.webView.viewPort = new Rectangle( 0, 720, stage.stageWidth, 80);
this.webView.loadURL( this.url );
this.webView.addEventListener(Event.COMPLETE, onComplete);
this.webView.removeEventListener(LocationChangeEvent.LOCATION_CHANGING, update0);
}
public function unDisplayAd() {
this.webView.stage = null;
}
protected function onComplete(event:Event):void{
if(this.adCnt==1) return;
this.webView.addEventListener(LocationChangeEvent.LOCATION_CHANGE, update);
this.webView.removeEventListener(Event.COMPLETE, onComplete);
this.adCnt = 1;
this.adTimer = new Timer(1000, 1);
this.adTimer.addEventListener(TimerEvent.TIMER_COMPLETE, adTimeout);
this.adTimer.start();
}
protected function adTimeout(e:Event) {
this.adTimer.removeEventListener(TimerEvent.TIMER_COMPLETE, adTimeout);
this.adCnt = 0;
this.webView.addEventListener(LocationChangeEvent.LOCATION_CHANGING, update0);
}
protected function update0(event:LocationChangeEvent):void {
this.webView.removeEventListener(LocationChangeEvent.LOCATION_CHANGING, update0);
if(event.location != this.url && this.adCnt == 0) {
event.preventDefault();
navigateToURL(new URLRequest(event.location));
this.displayAd();
}
}
protected function update(event:LocationChangeEvent):void {
this.webView.removeEventListener(LocationChangeEvent.LOCATION_CHANGE, update);
if(this.webView.location != this.url) {
event.preventDefault();
navigateToURL(new URLRequest(event.location));
this.displayAd();
}
}



追記:mediba-adに対応しきれてませんでした。
AIR for iOSにたよりきっているエモンです。
Javaやobj-cもやっていかなきゃイカンなーとおもいつつ、Flashが便利すぎるのでスケジュールがパツパツだとどうしてもFlashに頼る日々です。
さて最近Apple先生の動きに対して、AdobeAIRは対応しきれるのかという懸念があります。

懸念1:iPhone5のretina画面に対して
なにも考えずにアプリのアップデートをしようとしたら、申請フェーズで
「Invalid Binary」になってしまいました。
Appleからのメールを確認すると
iPhone 5 Optimization Requirement .
どうやらiPhone5対応が必須になっていたようです。
AIR for iOSだとdefault.pngを2つ用意すると大丈夫のようです。
・Default.png
・Default-568h@2x.png
この2つを含めると申請、アップデート、審査通過、公開までいきました。

懸念2:iOS7に対して
iOS7でもAIRは動くのか検証しました。ほぼ大丈夫でした。
自分のアプリでは、通信、広告表示、SharedObject、プルダウンなどしていますが、問題ないでしょう。
1つ問題があって、入力テキストボックスが複数行で構築されていた場合、
そこからテキストを入力しようとすると、にゅってアプリが上にスライドしますね。それが戻らなくなりました。
テキストボックスが1行だと問題なかったんですが、これはiOS7だけなのかどうかもよくわからないですね。