既に Flash で制作された iPhone アプリケーションを目にした事のある人も多いかと思いますが、昨年秋に MAX2009 で発表された Packager for iPhone の仕組みについての説明を少しばかり。
Packager for iPhone は Flash の出力を iPhone 用に変換する機能を持っています。少し紛らわしいですが、Flash CS5 に iPhone アプリの書き出し機能がある訳ではなくて、Flash CS5 には "iPhone アプリの書き出しができる Packager for iPhone" との連携機能がある、が正しい理解です。
これは賢い選択だったのではないかと思います。というのは、iPhone OS のアップデートがあっても、Packager for iPhone だけが対応すればよいからです。
AIR 書き出しの仕組み
まずは、AIR アプリケーション開発の流れの確認から話を始めます。下が AIR アプリ開発の大まかなステップです。
- Flash Professional でアプリケーション開発
- SWF, application.xml, その他必要なリソースを生成
- 上記を一つにパッケージ
- パッケージに署名
- .air ファイルとして配布
AIR アプリを iPhone にインストールできないかと考えたときに、一番楽そうな方法は iPhone 用の AIR ランタイムを開発して配布、なのですが、これはできません。一番の問題は、iPhone ライセンスが、JIT (Just in Time) コンパイラーやインタープリターの使用を禁じていることです。そのため、SWF 内のバイトコードを VM が実行時に解釈するという AIR の実行モデル自体が許可されないのです。
だったら SWF を ARM 向けに事前コンパイルするしかないですね、というのは簡単な結論ではありますが、それにより、どのプラットフォーム上でも実行できるという AIR アプリケーションの持つ利点を放棄する事になってしまいます (EXE ファイルに変換すると、iPhone 専用モジュールになってしまうからです)。にもかかわらず英断が行われて、SWF 用の AOT (Ahead of Time) コンパイラーとして開発されたのが Packager for iPhone ということになります。
これも良い選択だったのではないかと思います。実行モジュールとして配布することにすれば、今のアプリケーション流通モデルにそのまま乗っける事ができますし、どのプラットフォーム用にも作れるという Flash オーサリング環境の優位性はまだ残ってているわけですし。
Packager for iPhone の動き
というわけで、Packager for iPhone を使った iPhone アプリ書き出しの手順は、AIR での手順に中間作業が 1 つ増えたものになります。下が新しい手順です。
- Flash Professional でアプリケーション開発
- SWF, application.xml, その他必要なリソースを生成
- SWF を EXE にコンパイル、application.xml を info.plist に変換
- 上記を一つにパッケージ (.app)
- パッケージに署名
- .ipa ファイルとして配布
ステップ 3 が新しく追加された作業です。.app ファイルとしてパッケージする前に、SWF を iPhone 上で実行可能な EXE 形式に変換するというものです。4 と 5 も Packager for iPhone の担当範囲です。
Apple の規定に従う必要があるため詳細は異なる箇所もありますが、iPhone アプリの開発と AIR アプリの開発はよく似ています。 特に、ステップ 1 が同じということは、デスクトップ OS 向けの AIR アプリであれ iPhone 向けのアプリであれ、パブリッシュするまでの差はないということです。(もちろん Web 用の Flash アプリでも) そのため、アセットの共有も容易です。
とはいえ、性能も画面サイズもインタラクションモデルも異なる環境で使われるアプリがどれもまったく同じというわけにはいかないでしょうし、開発者にとってはいろいろと考えないといけないことが増えそうです。その辺りは今後このブログでも取り上げて行きたいと思ってます。
蛇足ですが、SWF から EXE への変換には LLVM が使われています。LLVM はオープンソースのコンパイラーで、C++ や Java など様々な言語で記述されたコードを x86 や ARM など複数のプラットフォーム用にコンパイルする事ができます。Packager for iPhone では SWF を ARM 向けにコンパイルするために使用しています。
コメントする