AIR 3.5 では iOS6 関連の主要なバグ修正が行われています。iPhone 5 のフルスクリーン表示にも対応した様なので、どうやら、AIR 3.5 から iOS6 と iPhone5 を正式サポートとなりそうな雰囲気です。
また、iOS 向けの新機能が、今回のアップデートで 2 つ追加されました。iOS 対応には引き続き力が入っている印象です。
ということで、この記事では、iOS 関連の新機能の使い方をご紹介します。ただし、これらの機能が AIR 3.5 で使えるようになることは保証されていません。
例えば、AIR 3.4 のベータ版が公開されたとき、ActionScript Workder 間での BitmapArray の共有機能が追加されていました。ところが、最終的には品質に問題があるという理由で、正式に公開されたバージョンには当該の機能がありません。
同様に、以下の機能も、AIR 3.5 の公開時に利用できるかどうかはまだ不明です。ですが、できるだけ多くの方がテストすることで、利用できる時期が早まるのは確かだと思いますので、「この機能欲しい!」 という方はぜひ実際にお試し下さい。
複数の SWF のパッケージと読み込みのサポート
今のところ、iOS 向けの AIR アプリでは、動的な SWF の読み込みの利用が大きく制限されています。そのため、1 つの SWF に全てのアセットをまとめてパッケージするのが一般的な作り方になっていると思います。
この新しい機能は、実行時に IPA パッケージ内から SWF を読み込み、読み込んだ SWF 内に定義されているアセットを利用できる、というものです。クラス定義やクラスとリンクされたシンボルの利用などに使えそうです。
SWF の読み込みは Loader を使います。その際、読み込む SWF は、同じ ApplicationDomain に読み込む必要があります。 (そもそも複数のドメインを使用することができないようです)
以下が、AIR の iOS アプリ内で SWF ファイルを読み込むサンプルコードです。
var myLoader:Loader = new Loader(); var url:URLRequest = new URLRequest("swfs/SecondSwf.swf"); var loaderContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain, null); // currentDomainに指定したパスからSWFを読み込む myLoader.load(url, loaderContext);
読み込んだ SWF に unload() を使ってリソースを解放するのはできないようです。また、loadBytes() も利用できません。
この辺りの制限は、おそらく読み込む SWF もネイティブコードに事前コンパイルされているためではないかと想像されます。
ということから、パッケージに必要なメモリは今まで以上に増えそうです。事前にネイティブコードにコンパイル済みの SWF をキャッシュでもしておいてくれれば、コンパイル時間の短縮ができそうですが。
ANE を静的ライブラリとパッケージ
ANE を自分でパッケージする人は少ないかもですが、次の新機能は、ANE にパッケージする複数の静的なライブラリやフレームワークを指定できるというものです。
これにより、ANE 内にソースコードをコピーすることなく、ライブラリが使えます。パッケージできるライブラリは、拡張子が .a、.framework、.o のどれかであることが条件です。
パッケージの対象とするライブラリの指定は、プラットフォーム記述ファイル内で行います。その際、名前空間に 3.5 を指定して、新しく追加された <packagedDependencies> タグを使用します。
下はそのサンプルです。<packagedDependencies> タグ内に、個々のライブラリを <packagedDependency> で指定しています。
<platform xmlns="http://ns.adobe.com/air/extension/3.1"> ... <packagedDependencies> <packagedDependency>foo.a</packagedDependency> <packagedDependency>abc/x.framework</packagedDependency> <packagedDependency>lib.o</packagedDependency> </packagedDependencies> </platform>
この指定はデバイス向けのパッケージにも、シミュレータ向けのパッケージにも使えます。デバイスの場合は armv7、シミュレータの場合は i386 アーキテクチャをサポートする必要があります。
なお、このオプションを指定する -platformoptions フラグは、指定の対象となるる -platform フラグの後、その他の -platform フラグの前に配置します。
例えば、上のサンプルでの指定がデバイス向けであれば、ANE のパッケージは以下の様な感じになります。
adt -package -target ane -swc abc.swc extension.xml -platform iPhone-ARM mainlib.a foo.a -platformoptions platform.xml abc/x.framework lib.o library.swf ... -platform iPhone-x86 library.swf mainlibSimulator.a ... -platform default library.swf
packagedDependency に指定されていないライブラリがコマンドラインに指定されていた場合は、通常のリンクとして扱われます。
以上 2 つの新機能ですが、どちらもいろいろなケースでの動作確認の後でないと、安心して使えない種類のものだと思いますので、今のうちに試して、問題があればフィードバックを送りましょう。
「複数の SWF のパッケージと読み込みのサポート」機能は
・ 少しでも初期起動を早くする為
・ プロジェクトを分割して開発しやすくする為
なのでしょうか?
あと、やはりアンロードができないのは、
ネイティブ開発と比べるとデメリットな感じがしますね。
この機会の Flash Player 共々、完全なアンロードが
サポートされれば多くのデベロッパーが喜ぶと思うのですが…