モバイルAdobe AIRアプリをPCに展開する2013-12-06 00:00

Adobe AIR Advent Calendarの6日目に飛び込み参加。

モバイルAIRアプリはAndroidとiOS向け、そんなふうに考えていた時期が俺にもありました。
(BlackBerryサポートはいつのまにか消えてる? )
実は、モバイルAIRアプリはAndroid向けのapk、iOS向けのipa、だけでなくWindowsやMac OS X向けのairファイルも書き出せるんですね。
これで1つのソースコードから4つのOS(Android、iOS、Windows、Mac)をカバーできちゃうぞ。

Flash Builder4.7で新規Flexモバイルプロジェクトを作成するとき「ターゲットプラットフォーム」には「Apple iOS」と「Google Android」があるだけ。
Flexモバイルプロジェクト作成画面

でも、リリースビルドの書き出しで「書き出し形式」項目の選択を「デスクトップでのインストール用の署名済み AIR パッケージ」にすると、.airファイルにパッケージされるのでWindowsやMac OS Xにインストールできるぞ。
モバイルFlexプロジェクト書き出し

ただし、AIRパッケージではネイティブエクステンションを使えないので100% Pure ActionScriptで限界に挑戦しましょう。
実際に1つのソースコードから4OSサポートのアプリ開発をしてますが、まあなんとかなります。

1つのソースといっても、OSや端末によってサポートされる機能が違うので気をつけないといけない部分はあります。
私はFlexモバイルプロジェクトで開発してますが、この時点で(デスクトップ向けの)Flexプロジェクトとサポートされる機能が違います。

デバイスプロファイルの記述通り、mobileDeviceプロファイルの機能だけサポートされます。「チェック」と書かれている機能は、実行時にisSupportedメソッドを呼び出して機能を使えるか確認しましょう。センサー類等のハードウェアが必要になる機能は使える使えないが想像できますが、NetworkInfo.isSupportedはiOSでは常にfalseだったりしてひどい。

OS毎に処理を分けたい場合は、Capabilities.osを見て分岐しましょう。
const isAndroid:Boolean = (Capabilities.os.toLocaleLowerCase().indexOf("linux") >= 0);
const isIOS:Boolean = (Capabilities.os.toLocaleLowerCase().indexOf("iphone") >= 0);
const isWin:Boolean = (Capabilities.os.toLocaleLowerCase().indexOf("windows") >= 0);
const isMac:Boolean = (Capabilities.os.toLocaleLowerCase().indexOf("mac os") >= 0);
こんな感じでいけます。
NetworkInfo.isSupportedの他に、SWFLoaderもiOSでは動作しないとか試してみてわかることが多すぎ。

あとは、app.xmlのinitialWindows要素内の記述はもともとデスクトップアプリ向けで、AndroidやiOSでは意味のないものが多いですが、モバイルAIRアプリでもWindowsやMac上で動作させる場合は有効です。(widthとかheightとか)
fullScreenをtrueにするとデスクトップでも全画面表示になってしまうので、実行時にOSを判別してモバイル端末だけ全画面にするとよいでしょう。
stage.displayState = StageDisplayState.FULL_SCREEN;
で全画面に切り替え、
stage.displayState = StageDisplayState.NORMAL;
で全画面解除になります。


クロスプラットフォーム開発の暗黒面はまた今度。
NativeApplication.nativeApplication.exit();でiOSじゃアプリ終了しやがらねえなんてかわいいもんだぜ。