Adobe AIR CS4 にて ApplicationUpdaterUI を使ってみる

アップデータがある場合であっても、
アプリケーションは通常起動するという流れの
ApplicationUpdaterUIの説明紹介が多いんですけど、
アップデータがある場合は、通常の起動をしない流れを考えてみる。

つまりは、アップデートしないと起動できないタイプのアプリケーション。
ただし、勝手にアップデートしちゃうんじゃなくて
ユーザアクションによってインストールへもっていく流れ。

要件はこんな感じ

・アップデータがある場合、アプリケーションは起動をしない。
・アップデータがない場合、通常起動する。
・アップデート作業中の画面インタフェースを閉じられた場合は
アプリケーションを閉じる、またはメッセージを表示する

で、最初にまず、CS4で air.update.ApplicationUpdaterUI を使えるようにする準備。
ライブラリパスに applicationupdater_ui.swc を通します。
applicationupdater_ui.swcは、CS4ディレクトリ内にすでにあります。

C:\Program Files\Adobe\Adobe Flash CS4\AIK1.5\frameworks\libs\air\applicationupdater_ui.swc

CS4、FlashDevelop への登録方法はこちらで説明しています。

CS4:
CS4:Flashコンポーネント(.swc)をライブラリパスに登録する (個別)
CS4:Flashコンポーネント(.swc)をライブラリパスに登録する (共通)

FlashDevelop:
FlashDevelop: Flashコンポーネント(.swc)をライブラリパスに登録する

以上登録したら、air.update.ApplicationUpdaterUI が使えるようになる。

続いて、ApplicationUpdaterUIに入っていく。

ApplicationUpdaterUIのXMLの設定など、基本的な細かいところは
こちらのページなどが参考になりました。
Adobe AIR Update Frameworkを使ってみる

要件を考え実装はこんな感じ。
※コード内コメントあり

”後でダウンロード” ボタンが押された時のイベントが取れなかったり
ちょっと微妙な部分が多くて微妙なイメージです。

ApplicationUpdaterUIがユーザによって閉じられたときのイベントがないっぽいです;;
うーこまった。

[as]
package
{

import flash.display.NativeWindow;
import flash.events.*;
import air.update.ApplicationUpdaterUI;
import air.update.events.UpdateEvent;
import air.update.events.StatusUpdateEvent;
import air.update.events.StatusUpdateErrorEvent;
import air.update.events.DownloadErrorEvent;
import air.update.events.StatusFileUpdateErrorEvent;
import flash.desktop.NativeApplication;

public class MyApplicationUpdater
{

private var oApplicationUpdaterUI:ApplicationUpdaterUI
private var updateURL:String = “http://example.com/app/update.xml”;

public function MyApplicationUpdater() {
initializeAndCheck()
}

public function initializeAndCheck() {
oApplicationUpdaterUI = new ApplicationUpdaterUI();

if (oApplicationUpdaterUI.isFirstRun) {
//アップデート後 初めての起動の場合
//アップデートはないと考え通常起動へ
// [ 実装 ]
return;
}

oApplicationUpdaterUI.addEventListener(StatusUpdateEvent.UPDATE_STATUS, onUpdateStatus);
oApplicationUpdaterUI.addEventListener(UpdateEvent.INITIALIZED, onInitialized);

//Error handling
oApplicationUpdaterUI.addEventListener(DownloadErrorEvent.DOWNLOAD_ERROR, onDownloadError);
oApplicationUpdaterUI.addEventListener(ErrorEvent.ERROR, onError);
oApplicationUpdaterUI.addEventListener(StatusFileUpdateErrorEvent.FILE_UPDATE_ERROR, onFileUpdateError);
oApplicationUpdaterUI.addEventListener(StatusUpdateErrorEvent.UPDATE_ERROR, onUpdateError);

oApplicationUpdaterUI.updateURL = updateURL;
oApplicationUpdaterUI.delay = 1;
oApplicationUpdaterUI.isCheckForUpdateVisible = false;
//oApplicationUpdaterUI.isDownloadUpdateVisible = false;
//oApplicationUpdaterUI.isFileUpdateVisible = false;
//oApplicationUpdaterUI.isInstallUpdateVisible = false;
//oApplicationUpdaterUI.isUnexpectedErrorVisible = false;

oApplicationUpdaterUI.initialize();

}

//初期化が完了した後に送出されます。
private function onInitialized(e:UpdateEvent) {
trace(e);

//アップデート画面を閉じられたときのハンドリングを設定
var nw:NativeWindow = NativeApplication.nativeApplication.openedWindows[NativeApplication.nativeApplication.openedWindows.length – 1] as NativeWindow;
nw.addEventListener(Event.CLOSING, onClosing); //なぜか Event.CLOSE は呼ばれないみたい

oApplicationUpdaterUI.checkNow();
}

//Updater が更新記述ファイルを正常にダウンロードして解釈した後で送出されます。
private function onUpdateStatus(e:StatusUpdateEvent) {
trace(e);
if (!e.available) {
destroy();
//アップデートはないので通常起動へ
// [ 実装 ]
}
}

private function onClosing(e:Event) {
trace(e);
//アップデート画面を閉じられたため、アプリケーションを終了へ
//メッセージを表示してあげるの親切かも
// [ 実装 ]
}

/* Error Handler */

//接続中または更新ファイルのダウンロード中にエラーが発生した場合に送出されます。
private function onDownloadError(e:DownloadErrorEvent) {
trace(e);
//エラーが発生、起動できない旨をメッセージ表示する
// [ 実装 ]
}

//初期化中または更新処理中にエラーが発生した場合 (何か予期しないことが発生した場合) に送出されます。
private function onError(e:ErrorEvent) {
trace(e);
//エラーが発生、起動できない旨をメッセージ表示する
// [ 実装 ]
}

//airFile パラメータ(installFromAIRFile() メソッドの呼び出し)として渡されたファイルの検証でエラーが発生した場合に送出されます。
private function onFileUpdateError(e:StatusFileUpdateErrorEvent) {
trace(e);
//エラーが発生、起動できない旨をメッセージ表示する
// [ 実装 ]
}

//更新記述ファイルをダウンロードまたは解析しようとしてエラーが発生した場合に送出されます。
private function onUpdateError(e:StatusUpdateErrorEvent) {
trace(e);
//エラーが発生、起動できない旨をメッセージ表示する
// [ 実装 ]
}

public function destroy() {
oApplicationUpdaterUI.removeEventListener(DownloadErrorEvent.DOWNLOAD_ERROR, onDownloadError);
oApplicationUpdaterUI.removeEventListener(ErrorEvent.ERROR, onError);
oApplicationUpdaterUI.removeEventListener(StatusFileUpdateErrorEvent.FILE_UPDATE_ERROR, onFileUpdateError);
oApplicationUpdaterUI.removeEventListener(StatusUpdateErrorEvent.UPDATE_ERROR, onUpdateError);

oApplicationUpdaterUI.removeEventListener(UpdateEvent.INITIALIZED, onInitialized);
oApplicationUpdaterUI.removeEventListener(StatusUpdateEvent.UPDATE_STATUS, onUpdateStatus);
}

}
}
[/as]