作成日

2 November 2010

その他の必要条件

  • Adobe AIR SDK 2.0
  • Flash Builder 4.0.1もしくはFlash Professional CS5
 
2010年6月9日にAdobe AIR 2がリリースされました。約2年半振りのメジャーバージョンアップとなり、多くの新機能追加と機能強化が行われています。本連載(全9回予定)では、 それら機能について詳しく説明するとともに、サンプルアプリを用いながらその使い方を解説していきます。

第1回 Adobe AIR 2をはじめよう
第2回 サーバーソケット/ データグラムソケットなどのネットワーク系機能
第3回 Safari 4.0.3 と同等の WebKit を搭載
第4回 プリンタ情報の取得や印刷ダイアログの制御
第5回 OSネイティブな機能との連携
第6回 OSネイティブとの統合
第7回 グローバルエラーハンドラー/IMEテキスト入力の機能強化

本記事では、Adobe AIR 2から新たに追加されたネイティブ統合について紹介します。ネイティブ統合とは、AIRアプリケーションから実行ユーザ権限範囲内においてOSネイティブなリソースを操作できることです。ネイティブ統合における新機能についてサンプルを交えながら解説します。

本記事のサンプル:AIR2master06sample.zip

新機能について

Adobe AIR 2から追加されたネイティブ統合では、以下の機能が追加されています。ネイティブ統合の機能を使うためには、必ずネイティブインストーラーでAIRアプリケーションをインストールする必要があります。

  • ネイティブインストーラー
  • ファイルをデフォルトアプリケーションで開く
  • ネイティブプロセスの実行と終了
  • ネイティブプロセスとの通信

それでは、個々の機能について詳しく解説していきましょう。

ネイティブインストーラー

Adobe AIR 2から追加されたネイティブ統合の機能を使ったAIRアプリケーションをインストールするためには、OS固有のネイティブインストーラーを作成する必要があります。AIRアプリケーションのネイティブ化の設定は共通ですが、OS固有のインストーラーになるのでOSごとに作成する必要があります。また、「第1回 Adobe AIR 2をはじめよう」で説明しているAIRインストーラー用の署名を準備しておきます。

ネイティブ化の設定

AIRアプリケーションをネイティブ化するためには、アプリケーション記述ファイルの中で、Adobe AIR 2から導入されたプロファイルを変更します。プロファイルは、APIと機能のセットを定義しています。

プロファイル名 説明
デスクトッププロファイル デスクトップコンピュータにインストールされるAIRアプリケーション用の機能のセットが定義されています。今までのAIRアプリケーションは、このプロファイルに該当します。
拡張デスクトッププロファイル デスクトッププロファイルを拡張して、OSネイティブにアクセスできる機能のセットが定義されています。このプロファイルのAIRアプリケーションは、OSごとのネイティブインストーラーでインストールする必要があります。
モバイルデバイスプロファイル モバイルデバイスにインストールされるAIRアプリケーションの機能のセットを定義されています。
拡張モバイルデバイスプロファイル モバイルデバイスを拡張して、HTMLLoaderクラスが追加された機能のセットが定義されています。このプロファイルがサポートするデバイスは今のところありません。

また、プロファイルの指定は、アプリケーション記述ファイルのsupportedProfilesで行います。supportedProfilesは、下記の表のような値を使用します。

説明
desktop デスクトッププロファイル
extendedDesktop 拡張デスクトッププロファイル
mobileDevice モバイルデバイスプロファイル
extendedMobileDevice 拡張モバイルデバイスプロファイル

よって、ネイティブ化するためには、アプリケーション記述ファイルを下記のように修正します。

<supportedProfiles>extendedDesktop</supportedProfiles>

プロファイルの作成手順:Flash Builder 4.0.1の場合

  1. Flexプロジェクトを選択して、Flash Builderの上部メニューの[プロジェクト]を展開して[リリースビルドのエクスポート]を選択します。
  2. [リリースビルドの書き出し]ウィザードが表示されます。
  3. [書き出し]のセクションで[ネイティブインストーラーに書き出し]を選択します。ここでWindowsの場合はexe, Mac OS Xの場合はdmgという拡張子のファイルが指定されます。
  1. [次]ボタンをクリックしてウィザードを進めます。この後は、通常のAIRを作成する手順と同様です。「第1回 Adobe AIR 2をはじめよう」を参照して下さい。

プロファイルの作成手順:Flash Professional CS5(11.0.2)の場合

  1. Flash Professional の上部メニューの[ファイル]を展開して[Adobe AIR 2の設定]をクリックします。
  2. [アプリケーションとインストーラーの設定]ダイアログが表示されます
  1. OSごとにインストーラーの拡張子が表示されています。Windowsインストーラー(.exe)にチェックを入れます。
  2. プロファイルを[拡張デスクトップ]のみ選択します。
  1. OKをクリックして設定を保存します。この後は、通常のAIRを作成する手順と同様です。「第1回 Adobe AIR 2をはじめよう」を参照して下さい。

ファイルをデフォルトアプリケーションで開く

第5回 OSネイティブな機能との連携」で説明したようにAdobe AIR 2では、テキストやPDFやMP3などの一般的なファイルを、OSで関連付けされているアプリケーションで開くことができます。ただし、通常のAIRではOS制限がありました。しかし、ネイティブインストーラーを使えばすべての形式のファイルを開くすべての形式のファイルを開くことができます。

サンプルは、第5回のネイティブ連携と同じものですが、アプリケーション記述ファイルで、プロファイルをextendDesktopに変更しています。

ネイティブプロセス

Adobe AIR 2で最も重要な機能は「ネイティブプロセス」です。この機能を使えば、OSネイティブなアプリケーションやスクリプトのプロセスを実行/終了させたり、実行させたプロセスと通信することができます。

プロセスの実行と終了

Adobe AIR 2からは、ユーザがOS上で実行可能なアプリケーションやスクリプトを実行させることができます。AIRアプリケーションから実行したプロセスは、AIRアプリケーションの子プロセスとして実行されます。実行するためには、NativeProcessとNativeProcessStartupInfoを使用します。その詳細については、サンプル「NativeProcessAppRunSample」を使って説明します。また、プロセスが終了された時には、NativeProcessExitEvent.EXITイベントが発生します。

サンプル「NativeProcessAppRunSample」を実行すると下記の画面が表示されます。このサンプルは、実行ファイルを指定して引数をつけて実行して、実行後は停止できるアプリケーションです。

以下は、このサンプルのコードです。

【プロセス実行処理の説明】
サンプルコード: NativeProcessAppRunSample.mxml

public function startProcess(file:File):NativeProcess{ //1.引数 var args:Array = args_ta.text.split(" "); var arguments:Vector.<String> = Vector.<String>(args); //2.実行情報の生成 var info:NativeProcessStartupInfo = new NativeProcessStartupInfo(); info.executable = file; info.arguments = arguments; //3.プロセス生成 var nativeProcess:NativeProcess = new NativeProcess(); //4.プロセスイベントハンドリング nativeProcess.addEventListener(NativeProcessExitEvent.EXIT, processExitHandler); //5.プロセス開始 nativeProcess.start(info); return nativeProcess; }
  1. 引数を準備します。サンプルでは入力された文字列をスペースで分割して引数を生成しています。
  2. プロセスを実行するための情報としてNativeProcessStartupInfoを生成します。NativeProcessStartupInfoのexecutableプロパティに実行したいアプリケーションファイルのインスタンスを指定します。また、引数はNativeProcessStartupInfoのargumentsプロパティに設定します。
  3. プロセスを実行するためにNativeProcessを生成します。
  4. プロセスの終了を監視するためにイベントをハンドリングします。
  5. プロセスの実行情報を使ってプロセスを実行します。

【プロセス終了処理の説明】
サンプルコード: NativeProcessAppRunSample.mxml

public function stopProcess(nativeProcess:NativeProcess):void{ nativeProcess.exit(); nativeProcess.removeEventListener(NativeProcessExitEvent.EXIT,trace); }

プロセスを終了させるにはNativeProcessインスタンスのexit()メソッドを呼び出します。

ネイティブプロセスとの通信

AIRアプリケーションから実行したプロセスは、標準入力、標準出力、標準エラー出力を通して直接通信することが出来ます。この詳細は、サンプルコードを使って説明します。

サンプル「NativeProcessAppRunAndCommSample」を実行すると下記の画面が表示されます。このサンプルは、実行ファイルを指定して引数をつけて実行して、実行後はアプリケーションと通信と実行中のアプリケーションを停止できます。

以下は、このサンプルのコードです。

【プロセス実行処理の説明】
サンプルコード: NativeProcessAppRunAndCommSample.mxml

public function startProcess(file:File):NativeProcess{ //1.引数 var args:Array = args_ta.text.split(" "); var arguments:Vector.<String> = Vector.<String>(args); //2.実行情報の生成 var info:NativeProcessStartupInfo = new NativeProcessStartupInfo(); info.executable = file; info.arguments = arguments; //3.プロセス生成 var nativeProcess:NativeProcess = new NativeProcess(); //4.プロセスイベントハンドリング nativeProcess.addEventListener(NativeProcessExitEvent.EXIT, processExitHandler); nativeProcess.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA,stdOutDataHandler); nativeProcess.addEventListener(ProgressEvent.STANDARD_ERROR_DATA,stdErrDataHandler); //5.プロセス開始 nativeProcess.start(info); return nativeProcess; }

プロセス実行は前のサンプルコードと同等です。異なる点は、標準出力と標準エラー出力のイベントをハンドリングしています。標準出力から取得できるデータがある場合は、ProgressEvent.STANDARD_OUTPUT_DATAイベントが発生します。標準エラー出力から取得できるデータがある場合は、ProgressEvent. STANDARD_ERROR_DATAイベントが発生します。また、標準入力にデータを送信しているとき場合は、ProgressEvent.STANDARD_INPUT_PROGRESSイベントが発生します。

【標準出力・標準エラー出力の処理の説明】
サンプルコード: NativeProcessAppRunAndCommSample.mxml

public function stdOutDataHandler(e:ProgressEvent):void{ var standardOutput:IDataInput = _nativeProcess.standardOutput; var output:String = standardOutput.readMultiByte(e.bytesLoaded,"utf-8"); stdout_ta.appendText(output); } public function stdErrDataHandler(e:ProgressEvent):void{ var standardError:IDataInput = _nativeProcess.standardError; var output:String = standardError.readMultiByte(e.bytesLoaded,"utf-8"); stdout_ta.appendText(output); }

標準出力のデータを読み込むためには、NativeProcessインスタンスのstandardOutputプロパティを使用します。データのサイズは、ProgressEventインスタンスのbytesLoadedから取得できます。標準エラー出力のデータは、NativeProcessインスタンスのstandardErrorプロパティを使用して、標準エラーと同様に処理できます。

【サンプルのネイティブアプリの説明】
サンプルコード: EchoApp.exe

using System; namespace EchoApp { class Program { static void Main(string[] args) { while (true) { var line = Console.ReadLine(); if (line.IndexOf("Error") == 0) { Console.Error.WriteLine("#" + line); } else { Console.WriteLine(">" + line); } } } } }

サンプルにネイティブアプリとして入っているEchoApp.exeは、標準出力された文字を標準出力や標準エラー出力に出力する.Net Frameworksアプリケーションです。VisualStudio2010でコンパイルしています。標準入力から読み込んだ文字列が、Errorから始まる場合は、その文字列を標準エラー出力に出力します。

おわりに

本記事では、Adobe AIR 2で追加されたOSネイティブ統合について説明しました。サンプルコードを実行することで、Adobe AIR 2のネイティブインストールとOSネイティブとの連携について理解できると思います。このネイティブ統合を使うと、特定のOSに依存したネイティブアプリケーションの開発が行うことができます。