首先介绍下自己的思路:现在air都分模块化的,所以也是分模块进行更新,外加程序进行更新,
就是从远程download下载swf然后替换本地的,程序更新是先down下来,然后使用自带的updater进行更新
说实在的我的flex有时候也弄不懂,有时候改了一个地方,不知道编译器会更改哪里,更新要先测试,是不是指更改了这一个模块;
好了上代码,首先是模块更新
package com.fileOperations { public class FileModuleUpdate extends Sprite { public function FileModuleUpdate() { } /** * 需要更新的数量 * */ private var swfCount:Number = 0; /** * 已经更新的数量 * */ private var updatedCount:Number = 0; private var newVersionXML:XML; /** * 获取新的配置文件 * */ public function getNewFileVersionConfigXMl(url:String):void{ swfCount = 0; updatedCount = 0; var loadUrl:URLLoader = new URLLoader(); loadUrl.load(new URLRequest(url)); loadUrl.addEventListener(Event.COMPLETE,checkIsUpdated); } private var url:String;//地址 private var _description:String;//升级描述 /** * 检查这个文件是不是需要更新,由总的文件版本号确定 * */ private function checkIsUpdated(event:Event):void{ var loader:URLLoader = URLLoader(event.target); var xml:XML = XML(loader.data); newVersionXML = xml; var object:XML; for(var i:int = 0;i<xml.children().length();i++){ object = xml.children()[i] as XML; var id:String = object.attribute("id"); if(id == "v_main"){ var version:String = (object.children()[0] as XML).@['value']; var dic :Dictionary = IocAppFacade.getInstance().getObject("v_main") as Dictionary; if(getIsHideVersion(dic,version)){ url = (object.children()[1] as XML).@['value']; description = (object.children()[2] as XML).@['value']; dispatchEvent(new FileUpdateEvent(FileUpdateEvent.FILE_HAVE_UPDATE,xml)); }else{ dispatchEvent(new FileUpdateEvent(FileUpdateEvent.NOT_FILE_HAVE_UPDATE)); } break; } } loader.close(); } public function updateFileMoudle(xml:XML):void{ updateThisSystem(xml); } /** * 判断版本号的大小 * */ private function getIsHideVersion(dic:Dictionary,version:String):Boolean{ if(dic==null||version.length==0){return false;} var local:Number = Number((dic['version'] as String).replace(".","")); var online:Number = Number(version.replace(".","")); return online>local; } /** * 检查这个文件是不是需要更新 * */ private function updateThisSystem(xml:XML):void{ var object:XML; var id:String; var version:String; var palce:String; for(var i:int = 2;i<xml.children().length();i++){ object = xml.children()[i] as XML; id = object.attribute("id"); version= (object.children()[0] as XML).@['value']; palce= (object.children()[1] as XML).@['value']; var dic :Dictionary = IocAppFacade.getInstance().getObject(id) as Dictionary; if(dic==null||getIsHideVersion(dic,version)){ swfCount++; if(palce.lastIndexOf("swf")!=-1){ updateThisModule(palce); }else{ updateThisConfig(palce); } } } } private function updateThisConfig(path:String):void{ var loadUrl:URLLoader = new URLLoader(); loadUrl.load(new URLRequest(url+path)); loadUrl.addEventListener(Event.COMPLETE,function():void{ var xml:XML = XML(loadUrl.data); saveXML(xml,path); swfUpdateSuccess(null); loadUrl.close(); }); } /** * 更新这个,模块 * */ private function updateThisModule(path:String):void{ var loadUrl:URLLoader = new URLLoader(); loadUrl.dataFormat = URLLoaderDataFormat.BINARY; loadUrl.load(new URLRequest(url+path)); loadUrl.addEventListener(Event.COMPLETE,function():void{ var stream:FileStream = new FileStream(); var fileName:String = getFileName(path); var file:File = new File(fileName); stream.openAsync(file, FileMode.UPDATE); stream.addEventListener(IOErrorEvent.IO_ERROR,function(e:IOErrorEvent):void{ swfUpdateSuccess(null); stream.close(); //这个是用来放置用户磁盘保护这样就会报错,所以会监视,关闭 }); stream.addEventListener(Event.CLOSE,swfUpdateSuccess); stream.writeBytes(loadUrl.data); stream.close(); loadUrl.close(); }); loadUrl.addEventListener(IOErrorEvent.IO_ERROR,function(e:IOErrorEvent):void{ swfUpdateSuccess(null); trace(e.toString()+"--------------流错误"); loadUrl.close(); }); } private function swfUpdateSuccess(e:Event):void{ updatedCount++; var percentage:Number = Math.floor(updatedCount*100/swfCount); dispatchEvent(new FileUpdateEvent(FileUpdateEvent.UPDATE_PERCENTAGE,percentage)); if(updatedCount == swfCount){ dispatchEvent(new FileUpdateEvent(FileUpdateEvent.UPDATE_COMPLETE)); saveXML(newVersionXML,"更新文件XML名"); } } /** * 对xml文件进行存储 * */ private function saveXML(xml:XML,name:String):void{ var xmlOperation:ConfigXmlOperation = new ConfigXmlOperation(); xmlOperation.fileName = File.applicationDirectory.resolvePath(name).nativePath; xmlOperation.writeConfigXml(xml); } /** * 获取文件的真是路径 * */ private function getFileName(path:String):String{ var fileName:String = File.applicationDirectory.resolvePath("根目录的一个文件名").nativePath; fileName = fileName.substring(0,fileName.indexOf("根目录的一个文件名")); return fileName += path; } public function get description():String{ return _description; } public function set description(value:String):void{ _description = value; } } }
然后是air文件更新代码:
package com.copote.fileOperations { public class AirFileUpdate extends Sprite { public function AirFileUpdate() { } /** * 文件的地址 * */ private var url:String; /** * 文件的版本号 * */ private var newVersion:String; public function checkMainAirIsNeedUpdate(xml:XML):void{ var object:XML; for(var i:int = 0;i<xml.children().length();i++){ object = xml.children()[i] as XML; var id:String = object.attribute("id"); if(id == "文件名"){ newVersion = (object.children()[0] as XML).@['value']; var dic:Dictionary = IocAppFacade.getInstance().getObject("文件名") as Dictionary; url = dic['palce']; dispatchEvent(new FileUpdateEvent(FileUpdateEvent.AIR_HAVE_UPDATE,getIsHideVersion(dic,newVersion))); break; } } } /** * 判断版本号的大小 * */ private function getIsHideVersion(dic:Dictionary,version:String):Boolean{ var local:Number = Number((dic['version'] as String).replace(".","")); var online:Number = Number(version.replace(".","")); return online>local; } public function updateAIR():void{ var file:File = new File(fileName); var loadUrl:URLLoader = new URLLoader(); loadUrl.dataFormat = URLLoaderDataFormat.BINARY; loadUrl.load(new URLRequest(url)); loadUrl.addEventListener(ProgressEvent.PROGRESS,getLoadProgress); loadUrl.addEventListener(Event.COMPLETE,function():void{ var stream:FileStream = new FileStream(); var file:File = new File(fileName); stream.openAsync(file, FileMode.UPDATE); stream.addEventListener(IOErrorEvent.IO_ERROR,function(e:IOErrorEvent):void{ stream.close(); //这个是用来放置用户磁盘保护这样就会报错,所以会监视,关闭 }); stream.addEventListener(Event.CLOSE,updateFile); stream.writeBytes(loadUrl.data); stream.close(); }); loadUrl.addEventListener(IOErrorEvent.IO_ERROR,function(e:IOErrorEvent):void{ trace(e.toString()+"--------------流错误"); loadUrl.close(); }); } private function get fileName():String{ var fileName:String = File.applicationDirectory.resolvePath("根目录的一个文件名").nativePath; fileName = fileName.substring(0,fileName.indexOf("根目录的一个文件名")); return fileName+"文件名"; } private function updateFile(event:Event):void{ var updater:Updater=new Updater ; var airFile:File= File.applicationDirectory.resolvePath("文件名"); updater.update(airFile,newVersion); } private function getLoadProgress(e:ProgressEvent):void{ var percentage:Number = Math.floor(e.bytesLoaded*100/e.bytesTotal); dispatchEvent(new FileUpdateEvent(FileUpdateEvent.UPDATE_PERCENTAGE,percentage)); } } }
更新中的事件
package com.copote.fileOperations.event { import flash.events.Event; public class FileUpdateEvent extends Event { /** * 文件升级 * */ public static const FILE_HAVE_UPDATE:String = "fileHaveUpdate"; /** * 文件升级 * */ public static const NOT_FILE_HAVE_UPDATE:String = "notFileHaveUpdate"; /** * 主程序升级 * */ public static const AIR_HAVE_UPDATE:String = "airFileHaveUpdate"; /** * 以加载的百分比 * */ public static const UPDATE_PERCENTAGE:String = "updatePercentage"; /** * 更新完成 * */ public static const UPDATE_COMPLETE:String = "updateComplete"; public var data:Object; public function FileUpdateEvent(type:String, mydata:Object =null, bubbles:Boolean = false, cancelable:Boolean = false) { super(type, bubbles,cancelable); data = mydata; } } }
界面就不写了,这里自己接触了流和文件读写,学习了下,配置文件时读取的xml
像这样子:
<object id="v_main" class="flash.utils.Dictionary"> <property name="version" value="0.3.6"></property> <property name="palce" value="连接文件的目录"></property> <property name="description" value="增加了一部分功能,修改了部分bug,对一些界面做了美化"></property> </object>
本地配置文件使用spring来读取的
存在的问题是,如果要更新就要对每一个模块写配置,比较麻烦
相关推荐
flashair电脑版是在电脑上使用flashair存储卡必装的一款软件,这款软件可以让用户对flashair卡进行设置、软件更新、初始化。flashair电脑版可通过无线LAN在电脑网络驱动器上查看FlashAir里的文件。可以选择数个照片...
微博air是基于新浪微博的air客户端,需要adobe air平台支持,支持在Windows、MAC、Linux下运行,可让微博支持即时聊天,好友上线提醒,沟通更快捷;丰富的个性功能,追求最佳用户体验。 安装方法: 第一步:...
FlashAir™设置软件下载 FlashAir™设置软件是在使用设备上对本产品进行设置、软件更新、初始化(格式化)时所必须的软件。 *关于FlashAir™设置软件的新信息,我们会在本网站上做随时更新,请确认。 固件更新工具...
航空导航 Air Navigation Pro v1.0.7 当前版本:1.0.7 软件语言:非中文 软件类别:GPS应用 软件大小:38.62 MB 适用固件:2.3及更高固件 内置广告:没有广告 适用平台:Android 资费提示:已付费版 空中导航是一...
flashair电脑版是在电脑上使用flashair存储卡必装的一款软件,这款软件可以让用户对flashair卡进行设置、软件更新、初始化。flashair电脑版可通过无线LAN在电脑网络驱动器上查看FlashAir里的文件。可以选择数个照片...
桌面Air客户端是新浪微盘推出的一款轻便简单的桌面网盘工具,本版本微盘管理...桌面Air客户端v1.2.3更新日志: 1、新增悬浮窗,随时查看文件传输速度和进度 2、支持文档在线编辑 3、一些细节优化 桌面Air客户端截图
我们都知道Adobe air已经放弃对Linux 的更新支持。而air 的PPA也已经被移除。但最起码在Ubuntu 12.04的依赖环境中,还是能够安装Air的上一个版本的。adobeair.deb
SinaTair新浪微博桌面客户端(微博air客户端)基于air平台的微博桌面客户端...A5源码友情提示:sinatair是一款基于Adobe AIR环境下的客户端软件,需要Adobe AIR环境支持,如果您未安装AIR环境请下点击下载安装:Adobe AIR
1、首先确定电脑安装了Adobe Air软件(点这里可以下载Adobe Air) 2、然后解压缩下载的软件 3、双击文件“DesktopiPhone.air”进行安装 4、软件会自动在桌面上创建快捷方式,点击进入后即可使用。
AP是一款小巧的免费音频播放器,无需安装,不会修改注册表,生成桌面快捷方式,加入启动菜单及快速启动。 自动下载和显示歌词、专辑封面。汇编级优化,占用极少系统资源...此软件还附带电台功能,可获取在线音乐电台。
2、脱离.net framework运行,再也不用为使用一个很小的C#软件而去安装20多M的框架了。 2010.1.25日更新: 1、优化界面圆角弧度,使界面圆角弧度更自然、更美观 2、更换新新LOGO 下载连接已经更新为新版。由于只是...
11.0.1.12 更新内容如下: 去除启动检测UI 提升软件启动速度 提升软件使用引导 提升软件运行速度 提升服务器连接速度 提升数据传输稳定性 修复软件多出已知问题 紧急修复软件授权错误 修改时间: 2013年1月...
您的善意捐赠将帮助我们暂停我的日常工作,并更加认真地开发此软件以备将来更新。 谢谢。 如果您在使用此软件时需要专门的支持服务,您可以通过 support[at]digicrafts.com.hk 与我们联系。 我们还提供软件...
Bupt-air 后台Flask + MySQLInstallationfork项目至本地目录并随时更新进度.配置Python3.6环境, 推荐使用Miniconda.Build Setupcd bupt-air-backend# 安装依赖pip install -r requirements.txt# 测试数据库连接情况...
汽车OTA主要分为FOTA(Firmware-over-the-air,固件在线升级)和SOTA(Software-over-the-air,软件在线升级)两类,前 者是一个完整的系统性更新,后者是迭代更新的升级。传统车企更新车内固件需要到4S店或者定点...
小新日历是一款非常好用的桌面日历软件,这款桌面日历软件拥有万年历查询、农历查询、生活记事、重要提醒、天气预报、黄历查询、放假安排、自动校对时间等功能,操作简单、界面美观,占用系统资源少。 功能介绍 1...
OTA Over-The-Air的缩写,即云端升级,通过无线连接进行固件更新 Physical Attack 一种攻击方法,使用了超出规格的设备(例如,电压过高/过低/温度或时钟,强光等)。 Replay Attacks 记录并重播加密消息或图像。在...
phone模拟器能在电脑上模拟iphone手机的操作,该iphone模拟器为adobe air应用,能在电脑上完美...这款iphone模拟器iphone浏览器功能可正常使用,其它功能目前仅为初步的模拟,以后会逐步完善,请关注本站这款软件更新。
首先登录您的air-port-codes.com帐户,然后添加可能需要访问API的任何域来更新您的帐户设置。 记下您的API密钥,因为对API的所有请求都将需要它。 请查阅每个特定于语言的目录中的特定于语言的文档。 一体化 Node....
智能手机屏幕截图器可方便地帮助您将手机屏幕显示内容用文件的形式保存下来,支持标准的Windows图像格式(bmp格式)和压缩格式(jpg)。...软件更新介绍:http://qun.qq.com/air/#15091100/bbs/list/cd/3