Ads

当記事の概要について
Adobe AIR 2.xで.exe形式のアプリケーションを書き出した場合に、air.update.ApplicationUpdaterUIクラスが上手く動作しませんでした。原因はair.update.ApplicationUpdaterUIがダウンロードした更新ファイルである.airは認識するが、.exeはエラーと認識してしまうためです。従って、.exeで書き出した場合にはair.update.ApplicationUpdaterクラスから更新ファイルをダウンロードさせる必要があるようです。
※air.update.ApplicationUpdaterUIクラスからのアプリケーションアップデートが出来る!という情報がございましたら、コメントへご指摘いただけると幸いです。
Adobe AIRとは?
仕事でAdobe AIR 2.7のアプリ開発を行っています。Adobe AIRとはmac OS,Windows,Linuxで動作するアプリ実行ランタイムのことです。ユーザーの実行環境に左右されにくいアプリを容易に提供できるという点がAdobe Flashと似てますよね。現在Adobe AIRの最新バージョンは2.7です。
本題の前に(1)…Adobe AIR 2.xへのバージョンアップにより進化したこと
Adobe AIR 1.xから2.xへのバージョンアップで面白い変化があったのは、コマンドラインベースのアプリとの連携が行えるようになったところです。世にはコマンドラインベースのアプリケーションが無数に存在しています。利用権限が問題なければ、コマンドラインベースのアプリケーションに専門知識が必要な一連の処理を任せる事ができるわけです。例えばAIRから読み込んだ音声ファイル(例:wav,aif)、または録音した音声(バイナリ)をmp3に書き出しする処理を必要とする場合には、mp3に関する専門知識が必要になります。ところがAIR 2.xではmp3エンコーダーで有名なlame(レイム)に書き出し処理を依頼する事も可能となります。
本題の前に(2)…AIRのコマンドライン連携には.exeに書き出しが必要
コマンドラインベースのアプリケーションとの連携にはNativeProcessクラスを使用します。注意すべき点はNativeProcessクラスを利用する場合にはデスクトップネイティブインストーラーのパッケージ化を行う必要があります。つまり通常の書き出しとは異なり、ADTコマンドからの書き出しになります。簡単に説明すると、前述したlame.exeのような外部のコマンドラインベースのアプリケーションを利用するわけですから、lame.exeもAIRのアプリケーションディレクトリに内包しておく必要があり、ここでADTによりパッケージ化の作業が必要なわけです。このとき、書き出したファイルは.airではなく.exeとなります。
.exeでair.update.ApplicationUpdaterUIは使えない
ここからが、本題です。通常アプリケーションのアップデート実装にはair.update.ApplicationUpdaterUIクラスが便利です。air.update.ApplicationUpdaterUIクラスでは、アップデートのチェックから、ダウンロード、更新インストールまで、更新インターフェースが用意されており、ある程度楽に一連の処理が実装できてしまいます。しかし残念ながら、.exeに書き出したAIRファイルはダウンロードの時点でエラーとなり、後続処理は中止されてしまいます(DownloadErrorEvent)。これは.airしか更新ファイルと認識しないことが原因のようです。この場合、以下のようなエラーメッセージが表示されます。
エラーメッセージ:There was an error downloading the update. Error# 16800
回避策としてair.update.ApplicationUpdaterで更新処理を実装する
これを回避するにはair.update.ApplicationUpdaterクラスを利用することで回避できそうです。air.update.ApplicationUpdaterクラスは更新インターフェイスの自作を行いたい場合に利用するクラスです。実装の流れとしては、更新バージョンチェックまではair.update.ApplicationUpdaterUIクラスと同様の処理を行い、あとは自作でダウンロード処理を実装することになります。以下のサンプルコードでは、更新が必要な場合にブラウザから更新アプリケーションファイルをダウンロードさせます。
下記コードはActionScript3.0,Adobe Flash CS4,Adobe AIR SDK 2.7の環境で動作します。Flash Builder,Flexを使用されている場合には適宜コードを変更してください。
//アップデートクラスのインポート
//事前にapplicationupdater_ui.swcへのライブラリパスを通しておいてください。
import air.update.events.*;
import air.update.ApplicationUpdater;
//起動中のアプリのバージョン
private var _AppVer:String = "";
//アップデータークラス
private var _updater:ApplicationUpdater = new ApplicationUpdater();
private function init(e:UpdateEvent):void{
//アップデート処理
//アプリケーションのアップデート情報を記載したXML
_updater.configurationFile = new File("app:/config/updaterConfig.xml");
//初期化した後の処理
_updater.addEventListener(UpdateEvent.INITIALIZED , omUpdaterInit);
//リモートサーバーにある更新アプリケーションの情報であるXMLをダウンロードした後の処理
_updater.addEventListener(StatusUpdateEvent.UPDATE_STATUS, onUpdateStatus);
//初期化
_updater.initialize();
}
private function onUpdaterInit(e:UpdateEvent):void{
_AppVer = e.target.currentVersion; //アプリの現行バージョンを保持
_updater.checkNow(); //アップデートの確認を行う
}
private function onUpdateStatus(event:StatusUpdateEvent):void{
//アプリケーションの更新が必要である場合
if( event.available){
//アップデートメッセージ
trace("アプリは最新版にアップデートを行う必要があります。アプリが開く「SoundPlayer.exe」を「実行」してください。\n\n[更新内容]:\n バージョン:"+String(event.version)+" (現在のバージョン:"+_AppVer+")\n 更新箇所:"+event.details.toString());
//ブラウザからアップデートファイルをダウンロードする
var urlReq:URLRequest = new URLRequest("http://gamagori-usen.jp/air-soundPlayer-update/SoundPlayer.exe");
navigateToURL(urlReq);
}
}
Ads