我们做一个AIR,一般都不会一次做完美。而发布出去后,用户安装了。这个时候就需要一个自动更新功能。你一次一次的去完美,就一次一次的更新版本号,通过版本号的不同来更新你的AIR.

         这里讲的一个方法,是没有用到AIR新的API(ApplicationUpdaterUI)。这里的流程如下,运行AIR,然后去读取服务器上的一个已经配置好的update.xml,通过xml获取服务器上的air程序的版本号,用这个版本号和当前已经安装的air程序的版本号对比。如果服务器上的版本号高于当前已经安装的版本,就更新air程序。

<?xml version="1.0" encoding="utf-8"?>   
  <update>   
      <version>1.2</version>   
      <url>D:\dev\version\qi.air</url>  
  </update>  

as code:

package com.vini123.utils
{
    import flash.display.Sprite;
    import flash.filesystem.File;
    import flash.filesystem.FileStream;
    import flash.filesystem.FileMode;
    import flash.desktop.Updater;
    
    import flash.net.URLLoader;
    import flash.net.URLRequest;
    import flash.desktop.NativeApplication;
    import flash.events.Event;
    import flash.net.URLStream;
    import flash.utils.ByteArray;
    import flash.utils.setTimeout;
    

    public class UpdateControl extends Sprite
    {
        private var updateVersion:String = "";
        private var updateFile:File;
        private var curVersion:String;
        private var upUrl:String;
        private var urlStream:URLStream;
        private var fileData:ByteArray;
        
        public function UpdateControl(version:String):void
        {
            curVersion = version;
            setTimeout(chackForUpdate,3000);
        }

        private function chackForUpdate():void
        {
            var loader:URLLoader = new URLLoader();
            var myRequest:URLRequest = new URLRequest();
            myRequest.url = "D:/dev/version/update.xml";
            loader.load(myRequest);
            loader.addEventListener(Event.COMPLETE,xmlCompleteHandler);
        }

        private function xmlCompleteHandler(e:Event):void
        {
            var xml:XML = XML(e.target.data);
            updateVersion = xml.version;
            upUrl = xml.url;
            checkStatus();
        }

        private function checkStatus():void
        {
            var appXML:XML = NativeApplication.nativeApplication.applicationDescriptor;
            var air:Namespace = appXML.namespaceDeclarations()[0];
            var curVersion:String = appXML.air::versionNumber;
            trace(curVersion);
            if (curVersion!=updateVersion)
            {
                startUpdate();
            }
        }

        private function startUpdate():void
        {
            var request:URLRequest = new URLRequest();
            request.url = upUrl;
            
            urlStream = new URLStream();
            fileData = new ByteArray();
            urlStream.addEventListener( Event.COMPLETE, ariCompleteHandler);
            urlStream.load(request);
            trace("开始");
        }

        private function ariCompleteHandler( event:Event ):void
        {
            trace("ok");
            urlStream.readBytes(fileData, 0, urlStream.bytesAvailable );
            updateFile = File.desktopDirectory.resolvePath("update.air");
            var fs:FileStream = new FileStream();
            fs.addEventListener(Event.CLOSE, performUpdate);
            fs.openAsync(updateFile, FileMode.WRITE );
            fs.writeBytes(fileData,0,fileData.bytesAvailable);
            fs.close();
        }

        private function performUpdate( event:Event ):void
        {
            var updater:Updater= new Updater();
            updater.update(updateFile,updateVersion);
        }
    }
}