Adobe Labs に AIR 3.7 ベータ版が公開されました。 (Adobe AIR 3.7 Beta@Labs)
主な新機能は以下の 4 つです。いずれもモバイル向けの機能です。
- Captive Runtime デバッグ機能 (Android):
Android 向けに Captive Runtime 機能を使ってパッケージされた AIR アプリのデバッグが可能に - Shared Object のバックアップ時の振る舞いを指定 (iOS):
Shared Object を iCloud へのバックアップ対象からはずすかどうか指定する属性の追加 - 強制的な CPU 描画モードの指定 (iOS):
特定の iOS デバイスでは GPU 描画の代わりに CPU 描画が使われるように指定できる - 実行時の外部 SWF ファイル読み込み (iOS):
スクリプトを含むアセットを SWF ファイルにパッケージ、実行時に外部から読み込んで利用できる
最後の動的な SWF ファイルの読み込み機能は、まだ AIR 3.7 公開時に含まれるかどうかは怪しい状態のようです。
今回公開されたベータ版のバージョンは、3.7.0.1240です。ダウンロードはこちらです。
Windows 8 は、デスクトップ環境のみがサポートされます。
また、AIR 3.7 から Android 向けは Captive Runtime のみのサポートになるようです。これにより、アプリと別に AIR のランタイムをダウンロードする必要はなくなりますが、アプリの大きさが 9MB ほど大きくなります。
新しい機能を利用するには、名前空間に 3.7 を指定します。
<application xmlns="http://ns.adobe.com/air/application/3.7">
また、コンパイル時に -swf-version=20 の指定も必要です。
Flash Builder 4.7 で新しい AIR SDK を使用するには、既存の SDK を置き換えます。 (元の SDK はどこかに保存しておきましょう)
AIR SDK の場所は、
- OS X: /Applications/Adobe Flash Builder 4.7/eclipse/plugins/com.adobe.flash.compiler_4.7.0.348297/AIRSDK
- Windows: C:\Program Files\Adobe\Adobe Flash Builder 4.7 (64 Bit)\eclipse\plugins\com.adobe.flash.compiler_4.7.0.349722\AIRSDK\
です。
新機能の詳細
Shared Object のバックアップ時の振る舞いを指定
現在の仕様では、Shared Object は iCloud へのバックアップ対象であり、これを変える手段はありませんでした。
AIR 3.7 では、preventBackup という新しい静的属性が追加され、この値を true にすることで iCloud へのバックアップ対象から除外することができるようになっています。
この機能は iOS 5.1 以降で利用できます。
下は簡単なサンプルコードです。
var mySO:SharedObject; mySO = SharedObject.getLocal("test"); mySO.data.id = 100; mySO.data.name = "myName"; SharedObject.preventBackup = true; mySO.flush();
強制的な CPU 描画モードの指定
renderMode に GPU を指定しながら、特定の iOS デバイスに対しては CPU 描画を行わせるためのタグ <forceCPURenderModeForDevices> が追加されました。
これは、第 1 世代の iPad や iPod のような、GPU の能力があまり高くないデバイスを念頭に追加された機能です。
例えば、以下の例は、iPod 4 と iPad では CPU 描画を、それ以外の iOS デバイスには GPU 描画を指定するものです。
<iPhone> <InfoAdditions> ... </InfoAdditions> <forceCPURenderModeForDevices>iPod4,1 iPad</forceCPURenderModeForDevices> </iPhone>
このように <forceCPURenderModeForDevices> タグは <iPhone> タグの下に指定します。指定できるデバイスには以下のようなものがあります。
"iPod4,1" // iPod Touch A4 "iPod5,1" // iPod Touch A5 "iPhone3,1" // iPhone 4 "iPhone4,1" // iPhone 4S "iPhone5,1" // iPhone 5 "iPad2,1" // iPad A5 "iPad2,3" // iPad Retina, A5 (CDMA) "iPad2,5" // iPad Mini Wifi "iPad3,1" // iPad Retina, A5X "iPad3,2" // iPad Retina, A5X (CDMA) "iPad3,4" // iPad Retina, A6X
実行時の外部 SWF ファイル読み込み
これまで、iOS 向けの AIR アプリで複数の SWF ファイルを利用する方法は、
- ActionScript を含まない SWF を外部から読み込む
- コンパイル時に複数の SWF を IPA ファイルにまとめてパッケージしておき、実行時にパッケージ内から読み込む
のどちらかでした。
今後は次の手段も利用できるようになりそうです。
- ActionScript を含むアセットを SWF ファイル化し、実行時に外部から読み込む
これが実現されれば、他のプラットフォーム用のコードをそのまま再利用できる可能性も出てきます。まだ実装作業が進行中のため AIR 3.7 公開時に間に合うかは不明だそうですが、期待の持てる新機能です。是非テストしてみてください。
この機能を利用するには以下の 3 つの手順が必要です。
- 外部にホストする SWF ファイルへのパスをテキストファイルに記述
- そのファイルへのパスをアプリケーション記述ファイル内に記述
- adt コマンドでパッケージする際、テキストファイルと swf ファイルを引数に指定
今のところ、adt コマンドを直接使う以外に、この機能を利用する方法は無いようです。Flash Professional や Flash Builder からの利用はサポートされません。
また、読み込む SWF に Flex のコードを含めることはできません。それと、あまりサイズの大きな SWF の読み込みも、問題を起こす場合があるようです。
ところで、この機能を使うとき、実際には、ActionScript コードを SWF ファイル内に持っているわけではありません。コードはコンパイル時に取り除かれています。
そのため、外部から SWF ファイルを読み込んでも iOS の規約に違反することにはならないのです。
取り除かれた ActionScript コードは ARM ネイティブのコードにコンパイルされ、アプリの一部としてパッケージされます。そして、コードの取り除かれた SWF が読み込まれると、改めて元のアセットと関連付けられます。
SWF の利用者から見れば、ActionScript を含む SWF ファイルを読み込んで利用しているのと変わらない状況です。iOS 向けの AIR アプリ開発のハードルが少し下がりそうですね。
最後に、この機能を使うための具体的な例を紹介しておきます。
まず、SWF のパスを含むファイルをつくります。以下のような普通のテキストファイルです。複数の SWF ファイルを読み込む場合は、行を分けて記述します。
assets/myLib.swf assets/sub/subLib.swf
このファイルの名前は SWFInfo.txt ということにします。このファイルへのパスを、アプリケーション記述ファイルに <externalSwfs> タグを使って記述します。場所は <iPhone> タグの直下です。
<iPhone> ... <externalSwfs>assets/swfInfo.txt</externalSwfs> </iPhone>
adt コマンドでパッケージする際には、通常の引数の後に、テキストファイルと外部から読み込む SWF ファイルを指定します。
adt -package -target ipa-app-store ... myApp.ipa mainSwf-app.xml mainSwf.swf assets/swfInfo.txt assets/myLib.swf assets/sub/subLib.swf
これで、テキストファイル内に指定された SWF ファイルからは ActionScript コードが取り除かれます。コードの無くなった SWF ファイルは、作業中のフォルダ内につくられる externalStrippedSwfs というフォルダの下に移動します。
あとは、コードの無い SWF ファイルをアプリからアクセス可能な場所に公開すれば準備完了です。
読み込むコードは通常のファイル読み込みと同様です。一部イベントハンドラ等は省略してますが、以下のような感じです。
var url:String= "http://my.sample.jp/myLib.swf"; var myUrlRequest:URLRequest = new URLRequest(url); var myLoader = new Loader(); myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,onComplete); var myLoaderContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain, null); try { myLoader.load(myUrlRequest, myLoaderContext); } function onComplete(e:Event):void { addChild(myLoader); }
以上で、読み込んだ SWF ファイル内の ActionScript を含むアセットを利用できるようになるはずです。
コメントする