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の自動更新が走るので、みれるのは次のバージョンアップから。。。