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がユーザによって閉じられたときのイベントがないっぽいです;;
うーこまった。

Actionscript:
  1. package
  2. {
  3.            
  4.     import flash.display.NativeWindow;
  5.     import flash.events.*;
  6.     import air.update.ApplicationUpdaterUI;
  7.     import air.update.events.UpdateEvent;
  8.     import air.update.events.StatusUpdateEvent;
  9.     import air.update.events.StatusUpdateErrorEvent;
  10.     import air.update.events.DownloadErrorEvent;
  11.     import air.update.events.StatusFileUpdateErrorEvent;
  12.     import flash.desktop.NativeApplication;
  13.            
  14.     public class MyApplicationUpdater
  15.     {
  16.                
  17.         private var oApplicationUpdaterUI:ApplicationUpdaterUI
  18.         private var updateURL:String = "http://example.com/app/update.xml";
  19.                
  20.         public function MyApplicationUpdater() {
  21.             initializeAndCheck()
  22.         }
  23.                
  24.         public function initializeAndCheck() {
  25.             oApplicationUpdaterUI = new ApplicationUpdaterUI();
  26.            
  27.             if (oApplicationUpdaterUI.isFirstRun) {
  28.                 //アップデート後 初めての起動の場合
  29.                 //アップデートはないと考え通常起動へ
  30.                 // [ 実装 ]
  31.                 return;
  32.             }
  33.                
  34.             oApplicationUpdaterUI.addEventListener(StatusUpdateEvent.UPDATE_STATUS, onUpdateStatus);
  35.             oApplicationUpdaterUI.addEventListener(UpdateEvent.INITIALIZED, onInitialized);
  36.            
  37.             //Error handling
  38.             oApplicationUpdaterUI.addEventListener(DownloadErrorEvent.DOWNLOAD_ERROR, onDownloadError);
  39.             oApplicationUpdaterUI.addEventListener(ErrorEvent.ERROR, onError);
  40.             oApplicationUpdaterUI.addEventListener(StatusFileUpdateErrorEvent.FILE_UPDATE_ERROR, onFileUpdateError);
  41.             oApplicationUpdaterUI.addEventListener(StatusUpdateErrorEvent.UPDATE_ERROR, onUpdateError);
  42.  
  43.             oApplicationUpdaterUI.updateURL = updateURL;
  44.             oApplicationUpdaterUI.delay = 1;
  45.             oApplicationUpdaterUI.isCheckForUpdateVisible = false;
  46.             //oApplicationUpdaterUI.isDownloadUpdateVisible = false;
  47.             //oApplicationUpdaterUI.isFileUpdateVisible = false;
  48.             //oApplicationUpdaterUI.isInstallUpdateVisible = false;
  49.             //oApplicationUpdaterUI.isUnexpectedErrorVisible = false;
  50.            
  51.             oApplicationUpdaterUI.initialize();
  52.                    
  53.         }
  54.                
  55.             //初期化が完了した後に送出されます。  
  56.             private function onInitialized(e:UpdateEvent) {
  57.                 trace(e);
  58.                
  59.                 //アップデート画面を閉じられたときのハンドリングを設定
  60.                 var nw:NativeWindow = NativeApplication.nativeApplication.openedWindows[NativeApplication.nativeApplication.openedWindows.length - 1] as NativeWindow;
  61.                 nw.addEventListener(Event.CLOSING, onClosing)//なぜか Event.CLOSE は呼ばれないみたい
  62.                
  63.                 oApplicationUpdaterUI.checkNow();
  64.             }
  65.            
  66.             //Updater が更新記述ファイルを正常にダウンロードして解釈した後で送出されます。
  67.             private function onUpdateStatus(e:StatusUpdateEvent) {
  68.                 trace(e);
  69.                 if (!e.available) {
  70.                     destroy();
  71.                     //アップデートはないので通常起動へ
  72.                     // [ 実装 ]
  73.                 }
  74.             }
  75.            
  76.             private function onClosing(e:Event) {
  77.                 trace(e);
  78.                 //アップデート画面を閉じられたため、アプリケーションを終了へ
  79.                 //メッセージを表示してあげるの親切かも
  80.                 // [ 実装 ]
  81.             }
  82.  
  83.             /* Error Handler */
  84.                
  85.                 //接続中または更新ファイルのダウンロード中にエラーが発生した場合に送出されます。
  86.                 private function onDownloadError(e :D ownloadErrorEvent) {
  87.                     trace(e);
  88.                     //エラーが発生、起動できない旨をメッセージ表示する
  89.                     // [ 実装 ]
  90.                 }
  91.                
  92.                 //初期化中または更新処理中にエラーが発生した場合 (何か予期しないことが発生した場合) に送出されます。
  93.                 private function onError(e:ErrorEvent) {
  94.                     trace(e);
  95.                     //エラーが発生、起動できない旨をメッセージ表示する
  96.                     // [ 実装 ]
  97.                 }
  98.                
  99.                 //airFile パラメータ(installFromAIRFile() メソッドの呼び出し)として渡されたファイルの検証でエラーが発生した場合に送出されます。
  100.                 private function onFileUpdateError(e:StatusFileUpdateErrorEvent) {
  101.                     trace(e);
  102.                     //エラーが発生、起動できない旨をメッセージ表示する
  103.                     // [ 実装 ]
  104.                 }
  105.                            
  106.                 //更新記述ファイルをダウンロードまたは解析しようとしてエラーが発生した場合に送出されます。
  107.                 private function onUpdateError(e:StatusUpdateErrorEvent) {
  108.                     trace(e);
  109.                     //エラーが発生、起動できない旨をメッセージ表示する
  110.                     // [ 実装 ]
  111.                 }
  112.            
  113.         public function destroy() {
  114.             oApplicationUpdaterUI.removeEventListener(DownloadErrorEvent.DOWNLOAD_ERROR, onDownloadError);
  115.             oApplicationUpdaterUI.removeEventListener(ErrorEvent.ERROR, onError);
  116.             oApplicationUpdaterUI.removeEventListener(StatusFileUpdateErrorEvent.FILE_UPDATE_ERROR, onFileUpdateError);
  117.             oApplicationUpdaterUI.removeEventListener(StatusUpdateErrorEvent.UPDATE_ERROR, onUpdateError);
  118.            
  119.             oApplicationUpdaterUI.removeEventListener(UpdateEvent.INITIALIZED, onInitialized);
  120.             oApplicationUpdaterUI.removeEventListener(StatusUpdateEvent.UPDATE_STATUS, onUpdateStatus);
  121.         }
  122.  
  123.     }  
  124. }

Bookmark and Share





blog.quq.jp