Adobe AIR Update Frameworkを使ってみる

2008/12/01 追記: AIR 1.5 SDKからAdobe AIR Update Frameworkが含まれていました

AIRアプリの自動更新の仕組みの話。

AIR 1.1で日本語対応がされたわけなんですが、SAGURIプレーヤーでは0.1.1まで自動更新ダイアログが英語で表示されてました。でもこれはAIRの問題じゃなくて、単純に使っているライブラリが英語のUIを持っていただけ。

http://blog.everythingflex.com/air-central/everythingflexair1swc/updatemanager/
AirAutoUpdaterという日本の方が作った(当然日本語)のAutoUpdateライブラリもあってこっちに置き換えようかなとか思ったりも。

http://www.libspark.org/wiki/AirAutoUpdater
というかAdobeさん、そろそろなんか考えとらんのかね。と思い調べてみたところあった。

http://labs.adobe.com/wiki/index.php/Adobe_AIR_Update_Framework
ドキュメントを読んで対応していくの巻。

Step1. frameworkを組み込みなさい

FlexBaseなら
applicationupdater.swc
applicationupdater_ui.swc
をlibに入れなさい。

UIあり版とUIなし版の二つあって、どっちかを入れればいいらしい。UとりあえずUI版を使いたいからFlexだからapplicationupdater_ui.swcを追加した。(HTMLベースの場合はswf(flaash)を使う)

Step2. 更新用ファイルを用意しなさい

つくった。

Step3. ApplicationUpdaterを作ってコンフィグを設定しろ

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns="http://ns.adobe.com/air/framework/update/configuration/1.0">
<url>http://example.com/updates/update.xml</url>
<delay>1</delay>
<defaultUI>
<dialog name="checkForUpdate" visible="false" />
<dialog name="downloadUpdate" visible="false" />
<dialog name="downloadProgress" visible="false" />
</defaultUI>
</configuration>

なファイルを用意して

var appUpdater:ApplicationUpdaterUI = new ApplicationUpdaterUI();
appUpdater.configurationFile = new File("cfg/updateConfig.xml");

でも良いし。以下の用に全部コードで設定してもいいらしい。

var appUpdater:ApplicationUpdaterUI= new ApplicationUpdaterUI();
appUpdater.updateURL = " http://example.com/updates/update.xml";
appUpdater.delay = 1;

configファイルをわざわざつくるなんて面倒なので、コードの方で対応。下記のようにする。ダイアログ表示についてはCheckForUpdateだけOFFにする。CheckForUpdateは更新をチェックするかどうかを問い合わせるダイアログのこと。自動でチェックして新しいバージョンがあったときだけフローに入りたいのでOFFにした。

var appUpdater:ApplicationUpdaterUI = new ApplicationUpdaterUI();
appUpdater.updateURL = " http://example.com/updates/update.xml";
appUpdater.delay = 1;
appUpdater.isCheckForUpdateVisible = false;

ちなみにdelayによるインターバルを判定するため%APPDATA%\{アプリケーションID}\Local Store\#ApplicationUpdater\state.xmlにチェック日を書いているようだ。

Step4. initializeをよべ

appUpdater.initialize();を唱えるだけでdelay(インターバル)を見て更新チェックしてくれる。

明示的に更新チェックする場合はcheckNow()を呼ぶ。

なお、試したところstate.xmlがない時はinitializeだけでは更新のフローに入らないようだ。ファイルがない=インストール直後と考えられるのでチェックしないのだろう。というわけでテストの時はstate.xmlの日付をdelay(インターバル)より昔にするか、checkNowを直接呼ぶのが吉。

プチトラブル

残念ながらダイアログに表示されるアプリケーション名が正しく表示されなかった。どうやらAIR1.1のローカライズ対応版の

<name>
<text xml:lang="en">Saguri Player</text>
<text xml:lang="ja">さぐりプレーヤー</text>
</name>

を認識してくれないので、古い書き方で

<name>Saguri Player</name>

に戻さざるを得なかった。むー。AIR 1.1対応版を期待。

結果

本物(!?)っぽくていいぞ!

ただ、今配布中のバージョンはeverythingflexの自動更新が走るので、みれるのは次のバージョンアップから。。。