首先介绍下自己的思路:现在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来读取的
存在的问题是,如果要更新就要对每一个模块写配置,比较麻烦
相关推荐
Flex AIR工程自动更新测试涉及到的是Adobe Integrated Runtime (AIR)应用程序的升级机制,这对于保持软件的最新状态和提供无缝用户体验至关重要。在Flex开发中,我们利用Adobe AIR SDK来创建跨平台的桌面应用程序。...
FlashAir™设置软件下载 FlashAir™设置软件是在使用设备上对本产品进行设置、软件更新、初始化(格式化)时所必须的软件。 *关于FlashAir™设置软件的新信息,我们会在本网站上做随时更新,请确认。 固件更新工具...
因此,更新到Adobe Flash 3 AIR可能是为了增强软件的安全性,确保用户的数据安全。 5. **用户体验优化**:Adobe可能会对用户界面进行改进,使其更加直观易用。此外,也可能对错误报告和调试工具进行了升级,以便...
这种开放性不仅保证了软件的透明度,还鼓励了持续的更新和改进,使得用户能够获得更加稳定、功能更丰富的投屏体验。开源软件通常有着活跃的社区支持,用户在遇到问题时可以寻求帮助,同时也可以为软件的发展贡献自己...
flashair电脑版是在电脑上使用flashair存储卡必装的一款软件,这款软件可以让用户对flashair卡进行设置、软件更新、初始化。flashair电脑版可通过无线LAN在电脑网络驱动器上查看FlashAir里的文件。可以选择数个照片...
3. 保持系统和软件更新:定期检查iPad Air的系统更新,确保操作系统版本是最新的,同时也要关注已安装软件的更新通知,及时更新到最新版本。有时候,软件闪退可能是因为兼容性问题,更新到最新版本往往能解决问题。 ...
这个版本号50.2.4.1代表着软件的更新迭代,通常包括性能优化、错误修复和新功能的添加。在软件开发中,每个小版本的提升都可能意味着对用户体验的改进或对开发者工具的支持增强。 Adobe AIR runtime是运行基于Adobe...
在实际应用方面,ADOBE AIR广泛应用于游戏开发、桌面工具、教育软件等各个领域。例如,许多流行的手机游戏如“愤怒的小鸟”最初就是通过AIR开发并移植到桌面平台的。同时,由于其对HTML5和JavaScript的支持,网页...
这个版本号33.1.1.744代表了软件的更新迭代,通常每个数字都对应着特定的修复、改进或新功能的添加。Adobe会定期发布新版本来优化性能、提升安全性,以及兼容新的操作系统版本和Web标准。 描述中提到的"adobe air ...
6. **更新机制**:AIR应用可以自动检测并下载新版本,简化了更新流程。 7. **应用示例**:许多知名应用如Twitter客户端TweetDeck、游戏植物大战僵尸等都曾使用Adobe AIR进行开发。 8. **发展和现状**:尽管Adobe已...
通过设置>通用>软件更新来检查并安装可用的系统更新。 4. 重置所有设置:如果上述方法都无法解决问题,可以尝试在设置>通用>重置>重置所有设置。注意,这将删除所有个性化设置,但不会抹除你的个人数据。 5. 重新...
Adobe AIR 33.1.1.744的更新可能包括性能优化、安全修复和新功能的添加。每次版本更新,Adobe都会致力于提高用户体验,增强稳定性,并修复已知问题。例如,它可能改进了内存管理,提高了应用的启动速度,或者增强了...
这时,你可以尝试更新软件版本,或者检查网络连接是否顺畅。 此外,虽然“win-airplay”提供了一种方便的投屏解决方案,但用户应关注隐私和安全问题,避免在不安全的网络环境下使用,以防数据被窃取或监控。 总的...
用户需要确认自己的打印机是否兼容AirPrint,或者是否有第三方固件更新使其支持。此外,由于AirPrint是基于网络的,因此网络连接的质量也会影响打印的效果和速度。 总之,“AirPrint for Windows X64/X86”是一个使...
2. **软件更新**:及时更新软件版本,修复已知问题并增强功能。 3. **文件查看与传输**:通过无线LAN在电脑网络驱动器上查看FlashAir内的文件,并且可以方便地将照片或文件传输到电脑上。 #### 三、FlashAir格式化...
4. **updaterConfig.xml**:此文件可能包含了应用程序更新的相关配置,用于自动检查和安装软件更新,保持应用的最新状态。 5. **assets**:这是一个文件夹,通常包含应用程序的资源文件,如图标、图片、字体等,...
此外,定期更新Adobe AIR到最新版本,以获得最新的功能和安全性更新。 Adobe AIR为开发者提供了一套丰富的API和工具,如Flex Builder或Flash Professional,用于构建美观、功能丰富的桌面应用程序。同时,它也为...
- **技术支持**:软件定期更新,确保用户获取最新的产品信息和技术支持。 总的来说,“Air Combi. Selector”是SMC为工程师提供的强大工具,它将复杂的元件选型工作化繁为简,是工业自动化设计中的得力助手。通过...
如果遇到问题,检查您的打印机设置、网络连接,或者查看设备和软件的更新,以解决任何可能出现的兼容性问题。 总之,AirPrint是iOS设备用户的一个强大工具,通过正确设置和利用提供的文件,Windows用户也能享受到这...
- **软件**:确保所有设备都安装了最新的软件更新,以获得最佳的AirPlay体验。 ### 3. 使用方法 - **设置**:在iOS设备上,进入“设置”> “屏幕镜像”,选择你的AirPlay设备进行连接。对于音乐和视频,只需打开...