iOS 視点からの Adobe AIR 2.6 の新機能

AIR 2.6 から、Windows, Mac, Linux, Android そして iOS がサポートされました。

これまで iOS 向けには Packager for iPhone という AIR SDK とは別の SDK が必要でしたが、これからは、AIR の書き出しオプションの 1 つとして iOS アプリを選択できるようになります。

これで、iOS 向けアプリのベースが AIR 2.0 から AIR 2.6 になりました。Packager for iPhone の時と比べると機能/パフォーマンス共に大きく改善され、また、マルチタスクや Retina ディスプレイにも対応しました。API は Android とほぼ同じに揃えられています。

AIR 2.6 では、iOS 4 以降をサポートします。iOS 3 はサポートしていません。

  • OS:iOS 4.0 以上
  • デバイス:ARM v7
    • iPhone 3GS, iPhone 4
    • iPad
    • iPod Touch 第 3 世代以降

そのため、例えば Packager for iPhone でパッケージした既存のアプリが iPhone 3G をサポートするものとして登録されていると、AIR 2.6 を使ってパッケージしたバージョンで更新することができません。これは、App Store には、アプリを更新する時に、サポートするデバイスを減らせないという制限があるためです。

新バージョンは別アプリとして公開することになるため、有償アプリだった場合は、再度購入して貰うことになります

iPhone OS 3 あるいは ARM v6 のデバイスを対象とするには、引き続き Packager for iPhone を利用します。Packager for iPhone は、Flash Professional CS5 に付属するものを使用できます。(Flash Professional CS5 に最新のアップデートが必要)

GPU 描画

Packager for iPhone での GPU 描画機能は、ベクター描画は CPU で行い、合成のみ GPU が担当するというものでした。そのため、パフォーマンスチューニングも特殊な手段に頼る必要がありました。

AIR 2.6 の GPU 描画ではベクター描画も GPU が行います。これにより、特殊なコーディング無しでも従来より高速な描画が実現できるようになりました。これは Android の GPU 描画と同等の機能です。

GPU 描画は、アプリケーション記述子内に <renderMode>gpu</renderMode> を指定すると有効になります。

Retina ディスプレイ

iPhone 及び iPod に高解像度モードの表示を指定できるようになりました。このモードは<requestedDisplayResolution> タグを使って切り替えます。値に high を指定すると 960 x 640 の解像度に対応した表示が可能になります。

<iPhone>
  <InfoAdditions>
    <![CDATA[...]]>
  </InfoAdditions>
  <requestedDisplayResolution>high</requestedDisplayResolution>
</iPhone> 

high の指定がなければ標準モードでの表示になります。480 x 320 ピクセルの解像度として表示されます。

Retina ディスプレイを搭載しないデバイスでアプリケーションを実行した場合は、 <requestedDisplayResolution> の設定に関わらず、解像度は 480 x 320 ピクセルとして表示されます。

Retina ディスプレイを搭載するデバイスの場合、高解像度モードでは Retina ディスプレイの各ピクセルを個別に扱えますが、標準モードでは Retina ディスプレイの 4 つのピクセルを 1 つのピクセルと見なして表示が行われます。

高解像度モードで使用するために、114 x 114 ピクセルのアイコンを忘れずに用意します。

<icon>
  <icon114x114>icons/myIcon114.png</icon114x114>
</icon>

デスクトップ上でのテスト用に、adl -screensize iPhoneRetina が使用できるようになりましたs。 

iOS 上の新機能

AIR 2.6 ベースになったことで、多くの機能が Android 同様に使えるようになりました。以下は主な機能のリストです。

  • マルチタスク
    iOS 4 のマルチタスクに対応。他のアプリに切り替わっても、バックグラウンドで継続して実行される
  • HTML コンテンツ
    アプリ内に HTML コンテンツを表示可能。flash.media.StageWebView クラスを使用する
  • マイク
    マイクからオーディオのキャプチャが可能。flash.media.Microphone クラスを使用する
  • カメラロール
    カメラロール内のイメージを参照可能。flash.media.CameraRoll クラスを使用する
  • カメラアプリケーション
    デフォルトのカメラアプリケーションを使用して写真またはビデオ撮影が可能。flash.media.CameraUI クラスを使用する (Android とは動作が異なる - 後述)
  • カメラ
    カメラからの映像にアクセス可能。flash.media.Camera クラスを使用する。前面および後面の両方のカメラが利用できる。同時に 2 つのカメラにアクセスはできない

StageWebView の動作

StageWebView の動作には、iOS と Android デバイス間で、いくつかの違いがあります。

  • フォーカスのスクリプトによる設定
    • iOS:assignFocus() メソッドが機能しない
    • Android:assignFocus() メソッドが機能する
  • リダイレクト時の LocationChangeEvent イベント
    • iOS:locationChanging および locationChange イベントが全てのリダイレクトに対して送出される (最初にロードされたページでは locationChange のみ送出)
    • Android:locationChanging イベントは全てのリダイレクトに対して、locationChange は最後のリダイレクトに対してのみ (最初にロードされたページを除く) 送出
  • StageWebView 内でのページのレンダリング
    • iOS:最初にロードされたページは、ビューポートに合わせて拡大 / 縮小される
    • Android:ビューポートに合わせて拡大 / 縮小されない
  • HTML 内の SWF
    • iOS:StageWebView ではサポートされない
    • Android:StageWebView でサポートされる

CameraUI と互換性

CameraUI はデバイスのネイティブカメラアプリを起動する API です。

CameraUI はネイティブのカメラアプリがそのまま利用できるため大変便利ですが、カメラアプリの動作が iOS と Android で異なるため注意が必要です。

Android で CameraUI を使って写真を撮るとカメラロールに保存されます。そのため、MediaEvent.data 属性からファイルを参照することができます。

var cameraUI:CameraUI = new CameraUI();
cameraUI.addEventListener(MediaEvent.COMPLETE, onCameraUIComplete);
cameraUI.launch(MediaType.IMAGE);
 
function onCameraUIComplete(e:MediaEvent):void
{
  // カメラロールを参照
  var picture:File = e.data.file;
}

しかし、iOS では、写真は自動的にカメラロールに保存されません。従って上の方法では常に写真が参照できるとは限りません。

そこで、MediaPromise を使って非同期に写真を読み込むよう、イベントハンドラーを変更します。この方法では、iOS と Android どちらでも期待通りの動作をします。

function onCameraUIComplete(e:MediaEvent):void {
  var cameraUI:CameraUI = e.target as CameraUI;
  cameraUI.removeEventListener(MediaEvent.COMPLETE, onCameraUIComplete);
 
  this.myLoader = new Loader();
  this.myLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, 
        onMediaPromiseLoaded);
 
  var mediaPromise:MediaPromise = e.data;
  this.myLoader.loadFilePromise(mediaPromise);
}
 
function onMediaPromiseLoaded(e:Event):void {
     var myLoaderInfo:LoaderInfo = e.target as LoaderInfo;
     myLoaderInfo.removeEventListener(Event.COMPLETE, 
        onMediaPromiseLoaded);
     // mpLoaderInfo.loader からイメージを取得できる
}

 

トラックバック(0)

トラックバックURL: http://cuaoar.jp/mt4/mt-tb.cgi/157

2014年1月

Sun Mon Tue Wed Thu Fri Sat
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
レンタルサーバー

月別 アーカイブ

Powered by Movable Type 4.261