我们做一个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); } } }