Adobeの公式UpdaterFrameWorkのサンプル

Adobeの公式UpdaterFrameWorkのサンプルです。

こちらのUpdaterは新しいバージョンのアプリケーションがサーバーに見つかった場合、自動でダウンロードやアップデートしてくれます。
先日のAIR支部のアプリに組み込まれています。
せっかくなのでソースの公開や使い方など。
まずはSDKのダウンロード
http://www.adobe.com/products/air/tools/sdk/
こちらをダウンロードして解凍すると「applicationupdater_ui.swc」「applicationupdater_.swc」なファイルが見つかるのでそれをプロジェクトのlibフォルダに入れればOK

※もしかしたら最新のFlexSDKには最初から入っているかも?
ユーザーインターフェイスあり版
applicationupdater_ui.swc
ユーザーインターフェイス無し版
applicationupdater.swc
バージョンの管理はネットワークを通じて最新のアプリがないか調べます。
管理用ファイルはxml形式です。
自分のxmlはこんな感じ
http://moeten.info/air/?m=download&type=versionxml&id=2
気を付けることはairのファイル置き場に&マークとかは入れないほうがいい感じ。

× http://yourserver/?type=air&download=4
○ http://yourserver/4.air

このバージョンと現在のAIRアプリの中のバージョンの適合性をチェックしてからアップデートされます。
ちなみに制作者側でAIRアプリのバージョンの指定は以下の方法でできます。

AIRプロジェクトのprojectname-app.xmlのversionタグで指定。
ソース全体

<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
    clipContent="false"
    backgroundColor="0xffffff" backgroundAlpha="0"
    showGripper="false"
    showInAutomationHierarchy="false"
    showStatusBar="false"
    showTitleBar="false"
    borderThickness="0"
    width="530" height="356"
    mouseDown="onMouseDown()"
    creationComplete="init()"
    >
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import flash.events.ErrorEvent;
import air.update.ApplicationUpdaterUI;
import air.update.events.UpdateEvent;
import com.trick7.utils.TeraClock;
private var clock:TeraClock = new TeraClock();
private var appUpdater:ApplicationUpdaterUI = new ApplicationUpdaterUI();
private function checkUpdate():void {
    setApplicationVersion();
    appUpdater.updateURL = "http://moeten.info/air/?m=download&type=versionxml&id=2";
    appUpdater.addEventListener(UpdateEvent.INITIALIZED, onUpdate);
    appUpdater.addEventListener(ErrorEvent.ERROR, onError);
    appUpdater.isCheckForUpdateVisible = false;
    appUpdater.initialize();
}
private function onUpdate(event:UpdateEvent):void {
    appUpdater.checkNow();
}
private function onError(event:ErrorEvent):void {
    Alert.show(event.toString());
}
private function setApplicationVersion():void {
//    var appXML:XML = NativeApplication.nativeApplication.applicationDescriptor;
//    var ns:Namespace = appXML.namespace();
//    lblAppVersion.text = "App version: " + appXML.ns::version;
}
private function init():void{
    checkUpdate();
    clock.addEventListener(TeraClock.SECONDS_CHANGED, myTimer );
    soundPlay('18');
}
private function myTimer( e:Event ):void{
    myClock.text = "" + clock.hours2 + ":"    + clock.minutes2;
if(  ! myImage_sleep.visible ){
    if( clock.seconds == 0 ){
        myImage_basic.visible    = false;
        myImage_bikkuri.visible  = true;
    }else{
        myImage_bikkuri.visible  = false;
        if( clock.seconds %10 == 0 ){
            myImage_basic.visible = false;
            myImage_wink.visible  = true;
        }else{
            myImage_basic.visible = true;
            myImage_wink.visible  = false;
        }
    }
}
    notDowned++;
    if( notDowned >= 300 ){
        if( ! myImage_sleep.visible )soundPlay('19');
        myImage_sleep.visible = true;
        myImage_basic.visible = false;
    }
}
private function soundPlay( file:String ):void{
    mySound.source = "" + file + ".mp3";
    mySound.play();
}
private var notDowned:int = 0;
private function onMouseDown():void{
    this.nativeWindow.startMove();
    notDowned = 0;
    soundPlay('06');
    myImage_basic.visible = true;
    myImage_sleep.visible = false;
}
]]>
</mx:Script>
<mx:SoundEffect id="mySound" target="{this}" useDuration="false" />
<mx:GlowFilter id="gf" blurX="4" blurY="4" color="0xffffff" strength="8"/>
<mx:DropShadowFilter id="dsf" blurX="8" blurY="8" distance="0" color="0x000000"/>
<mx:Image source="kumo.png" x="0" y="0" alpha="0.8"/>
<mx:TextArea id="myClock" filters="{[gf,dsf]}"
    color="0xff2ce9"
    selectable="false"
    editable="false"
    fontSize="64"
    borderThickness="0"
    backgroundAlpha="0" backgroundColor="0xffffff" x="77" y="65"  width="215" height="87"/>
<mx:Image source="04.png" x="225" y="0" id="myImage_sleep"    visible="false" />
<mx:Image source="03.png" x="225" y="0" id="myImage_wink"    visible="false" />
<mx:Image source="02.png" x="225" y="0" id="myImage_bikkuri" visible="false" />
<mx:Image source="01.png" x="225" y="0" id="myImage_basic"   visible="true" />
<mx:VBox visible="false">
    <mx:Label id="lblAppVersion" width="300" />
</mx:VBox>
</mx:WindowedApplication>