モバイル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」があるだけ。
でも、リリースビルドの書き出しで「書き出し形式」項目の選択を「デスクトップでのインストール用の署名済み AIR パッケージ」にすると、.airファイルにパッケージされるのでWindowsやMac OS Xにインストールできるぞ。
ただし、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じゃアプリ終了しやがらねえなんてかわいいもんだぜ。
コメント
トラックバック
このエントリのトラックバックURL: http://shimitei.asablo.jp/blog/2013/12/06/7096681/tb
※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。
コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※なお、送られたコメントはブログの管理者が確認するまで公開されません。