AdobeAirでの自動Updateの仕組みですが、前回の記事を書いてから、Adobe AIR Update Frameworkというのがあるのを知りました。
早速これを使った方法のご紹介。
私が使ったのは 2008/06/24リリースのバージョンですが、またBetaのようです。
前回の方法では、AIRパッケージのDownloadなどは自分でする必要があったり、バージョンを書くXMLは独自形式だったりしたんですが、Adobe AIR Update Frameworkを使うと、それらはこのフレームワークでやってくれるようになります。
2008/12/29追記
AIR1.5よりUpdateFrameworkは同梱されるようになったようです。
AIR SDK 1.5のframeworks/libs/airの下にswcファイルが含まれています。
AIRのランタイムが1.5を使っている場合には、swcファイルは一緒にパッケージしなくてもOKになってます。
概要のイメージとしては、以下の感じになります。
さて、実際組み込んでみます。
<defaultUI>にはAdobe AIR Update Frameworkでの属性を指定します。
appUpdater.configurationFile = new File("app:/update.xml");
で2.で作成したXMLを読み込んでいます。この例だとパッケージ直下にupdate.xmlというファイル名で設定を入れている状態です。
appUpdater.checkNow();というのが更新チェックをすぐに行なうというメソッドになります。
上記の例では、
コンストラクタにてUpdateEvent.INITIALIZEDで初期化が終わったタイミングをListenして、appUpdater.checkNow();を呼んでいるので、このクラスをインスタンス(new)した時点でチェックが実行される形になっています。
UpdateEvent.INITIALIZEDで初期化が終わったタイミングでないと、checkNowを呼んでもなにも起こらないので注意!
2008/09/10 追記:
現在はAdobeAIR Update Frameworkを使うと、Command+Qでの終了が出来なくなる不具合があるようです。
http://www.adobe.com/cfusion/webforums/forum/messageview.cfm?forumid=72&catid=670&threadid=1373568&enterthread=y
詳しくは↑を。。
つーことで、とりあえずのバグ回避としては上記URLの内容にならって以下のコードを追記してあげればOKでした。
NativeApplication.nativeApplication.addEventListener(Event.EXITING,
function(e:Event):void {
var opened:Array = NativeApplication.nativeApplication.openedWindows;
for (var i:int = 0; i < opened.length; i ++) {
opened[i].close();
}
});
たとえば、アプリケーション起動時にすぐに実行したいのであれば、ApplicationCompleteのタイミングなどで
var appUpdater:UpdateManager = new UpdateManager();
を行ないます。
▶リリースノートをクリックすると、サーバに配置したXMLのdescriptionの内容が表示されます。
今すぐダウンロードを選ぶと、ダウンロードが始まります。
完了すると、以下のような画面になります。
んー、便利ですね。
早速これを使った方法のご紹介。
私が使ったのは 2008/06/24リリースのバージョンですが、またBetaのようです。
前回の方法では、AIRパッケージのDownloadなどは自分でする必要があったり、バージョンを書くXMLは独自形式だったりしたんですが、Adobe AIR Update Frameworkを使うと、それらはこのフレームワークでやってくれるようになります。
2008/12/29追記
AIR1.5よりUpdateFrameworkは同梱されるようになったようです。
AIR SDK 1.5のframeworks/libs/airの下にswcファイルが含まれています。
AIRのランタイムが1.5を使っている場合には、swcファイルは一緒にパッケージしなくてもOKになってます。
概要のイメージとしては、以下の感じになります。
- サーバ側に最新バージョンとAIRパッケージの記述を書いたXMLファイルを配置。
- AIRアプリケーション内にサーバに配置したXMLのURLなどを書いたXMLを一緒にパッケージ。
- チェックする際には、パッケージされたXMLからバージョンXMLのURLを取得して、バージョンが違えば、指定されたURLからAIRパッケージをダウンロードしてインストール
さて、実際組み込んでみます。
0. Adobe AIR Update Frameworkのサイトから、モジュールをDownload。
中に入っている、applicationupdater_ui.swcをクラスパスに含めておきます1. サーバ側に最新バージョンの記述を書いたXMLファイルを配置。
記述例としては以下の感じ。<?xml version="1.0" encoding="utf-8"?>
<update xmlns="http://ns.adobe.com/air/framework/update/description/1.0">
<version>1.0.5</version>
<url>http://www.assembla.com/spaces/ASlimTimer/documents/cUO-6eFkWr3Awzab7jnrAJ/download/aslimtimer-1.0.5.air</url>
<description><![CDATA[New version includes:
* Alarm機能の追加
* Task開始時にWindowを小さくする設定を追加
* Windowサイズ切替時にテーブル列サイズが変更されてしまう不具合を修正
* Updateの仕組みをAirApplicationUpdateに変更]]></description>
</update>
<update xmlns="http://ns.adobe.com/air/framework/update/description/1.0">
<version>1.0.5</version>
<url>http://www.assembla.com/spaces/ASlimTimer/documents/cUO-6eFkWr3Awzab7jnrAJ/download/aslimtimer-1.0.5.air</url>
<description><![CDATA[New version includes:
* Alarm機能の追加
* Task開始時にWindowを小さくする設定を追加
* Windowサイズ切替時にテーブル列サイズが変更されてしまう不具合を修正
* Updateの仕組みをAirApplicationUpdateに変更]]></description>
</update>
2. AIRアプリケーションに組み込んでおくXMLを作成する。
記述例としては以下の感じ。<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns="http://ns.adobe.com/air/framework/update/configuration/1.0" >
<url>http://www.assembla.com/spaces/ASlimTimer/documents/aDRksiFk0r3Awzab7jnrAJ/download/update.xml</url>
<delay>1</delay>
<defaultUI>
<dialog name="checkForUpdate" visible="false" />
<dialog name="downloadUpdate" visible="true" />
<dialog name="downloadProgress" visible="true" />
<dialog name="installUpdate" visible="true" />
</defaultUI>
</configuration>
<url>には、1.で作成したXMLのパスを記述します。<configuration xmlns="http://ns.adobe.com/air/framework/update/configuration/1.0" >
<url>http://www.assembla.com/spaces/ASlimTimer/documents/aDRksiFk0r3Awzab7jnrAJ/download/update.xml</url>
<delay>1</delay>
<defaultUI>
<dialog name="checkForUpdate" visible="false" />
<dialog name="downloadUpdate" visible="true" />
<dialog name="downloadProgress" visible="true" />
<dialog name="installUpdate" visible="true" />
</defaultUI>
</configuration>
<defaultUI>にはAdobe AIR Update Frameworkでの属性を指定します。
| checkForUpdate | 更新チェックを行なうかどうか、ユーザに確認するダイアログを表示する |
| downloadUpdate | 更新がある時にダウンロードをするかどうか、ユーザに確認するダイアログを表示する |
| downloadProgress | ダウンロード中に進捗ダイアログを表示するかどうか |
| installUpdate | インストールするかどうか、ユーザに確認するダイアログを表示する |
3. Adobe AIR Update Frameworkを実行するクラスを作成する。
package controller {
import air.update.ApplicationUpdaterUI;
import air.update.events.UpdateEvent;
import flash.filesystem.File;
import flash.events.ErrorEvent;
import flash.events.Event;
import mx.core.UIComponent;
public class UpdateManager extends UIComponent {
private var appUpdater:ApplicationUpdaterUI = new ApplicationUpdaterUI;
public function get applicationUpdater():ApplicationUpdaterUI{
return appUpdater;
}
public function UpdateManager() {
super();
appUpdater.configurationFile = new File("app:/update.xml");
appUpdater.addEventListener(ErrorEvent.ERROR, onError);
appUpdater.addEventListener(UpdateEvent.INITIALIZED,
function (event:UpdateEvent):void {
checkForUpdate();
}
);
appUpdater.initialize();
}
private function onError(ev:ErrorEvent):void {
}
public function checkForUpdate():void {
appUpdater.checkNow();
}
}
}
import air.update.ApplicationUpdaterUI;
import air.update.events.UpdateEvent;
import flash.filesystem.File;
import flash.events.ErrorEvent;
import flash.events.Event;
import mx.core.UIComponent;
public class UpdateManager extends UIComponent {
private var appUpdater:ApplicationUpdaterUI = new ApplicationUpdaterUI;
public function get applicationUpdater():ApplicationUpdaterUI{
return appUpdater;
}
public function UpdateManager() {
super();
appUpdater.configurationFile = new File("app:/update.xml");
appUpdater.addEventListener(ErrorEvent.ERROR, onError);
appUpdater.addEventListener(UpdateEvent.INITIALIZED,
function (event:UpdateEvent):void {
checkForUpdate();
}
);
appUpdater.initialize();
}
private function onError(ev:ErrorEvent):void {
}
public function checkForUpdate():void {
appUpdater.checkNow();
}
}
}
appUpdater.configurationFile = new File("app:/update.xml");
で2.で作成したXMLを読み込んでいます。この例だとパッケージ直下にupdate.xmlというファイル名で設定を入れている状態です。
appUpdater.checkNow();というのが更新チェックをすぐに行なうというメソッドになります。
上記の例では、
コンストラクタにてUpdateEvent.INITIALIZEDで初期化が終わったタイミングをListenして、appUpdater.checkNow();を呼んでいるので、このクラスをインスタンス(new)した時点でチェックが実行される形になっています。
UpdateEvent.INITIALIZEDで初期化が終わったタイミングでないと、checkNowを呼んでもなにも起こらないので注意!
2008/09/10 追記:
現在はAdobeAIR Update Frameworkを使うと、Command+Qでの終了が出来なくなる不具合があるようです。
http://www.adobe.com/cfusion/webforums/forum/messageview.cfm?forumid=72&catid=670&threadid=1373568&enterthread=y
詳しくは↑を。。
つーことで、とりあえずのバグ回避としては上記URLの内容にならって以下のコードを追記してあげればOKでした。
NativeApplication.nativeApplication.addEventListener(Event.EXITING,
function(e:Event):void {
var opened:Array = NativeApplication.nativeApplication.openedWindows;
for (var i:int = 0; i < opened.length; i ++) {
opened[i].close();
}
});
4. AIRアプリケーションに組み込み
3.で作成したクラスを、実行したいタイミングでnewします。たとえば、アプリケーション起動時にすぐに実行したいのであれば、ApplicationCompleteのタイミングなどで
var appUpdater:UpdateManager = new UpdateManager();
を行ないます。
そうすると...
更新がある場合にはこんなメッセージがでてきます。▶リリースノートをクリックすると、サーバに配置したXMLのdescriptionの内容が表示されます。
今すぐダウンロードを選ぶと、ダウンロードが始まります。
完了すると、以下のような画面になります。
んー、便利ですね。



