请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站原RIAMeeting

瑞研社区

 找回密码
 立即注册

QQ登录

实验:关于桌面部署AIR应用的一些探讨

发表于 2011-7-13 17:12:46 |显示全部楼层

现在使用Adobe AIR技术开发应用的朋友越来越多了,不知大家是否想过这个问题,就是如何部署和安装你的应用?我们来简单分析一下Adobe为我们提供的两种方式:

  1. WEB部署安装的机制(即AIR Install Badge):在网络普及率很高的情况下这样的方式是很好的,在部署(包括跨平台)和版本控制上都很方便,但是假如用户没有联网条件,就不可行。
  2. 桌面分发:即通过把你的AIR安装包(.air文件)发给用户安装,但如果用户没有安装AIR的运行时,就无法安装,当然你可以再发给用户一个AIR运行时的安装包,写个说明让用户先安装AIR运行时,再安装你的应用,问题是这种繁琐的操作是极其破坏用户体验的。

那么引入今日的问题,即:

如果是情况2,是否可以将运行时和应用整合到一个安装包?

至少要让用户点击一个安装文件就可以完成整个的安装过程。仔细分析之后,原理上应该是可行的,原因如下:

  1. 可以通过Adobe提供的API判断用户是否安装了运行时
  2. 可以通过EXEC来启动AIR运行时的安装

这样的话,我们就可以使用Flash创作一个EXE文件,来执行上述两个步骤的操作,当然这样的缺点就是牺牲了跨平台的特性,如果你的用户在Mac系统上,就要考虑Mac系统上如何实现。

实现方案

首先下载这个SWF文件(http://airdownload.adobe.com/air/browserapi/air.swf),这是Adobe提供的AIR API的接口,我们需要使用它来判断AIR运行时是否安装。

建立一个FLA文档,命名为“Setup.fla‘。将air.swf保存到和这个FLA同级的目录下,并在这个目录下创建一个名为“fscommand‘的目录,注意这是因为如果你使用EXEC的话,只能调取这个目录中的内容

到Adobe网站下载最新的AIR运行时安装包(AdobeAIRInstaller.exe),保存到“fscommand‘目录中。将你的AIR应用安装包(比如Train.air),也放到这个目录中。

同样在“fscommand‘目录中,建立一个“openApp.bat‘的文件,写入你的AIR文件名,比如:Train.air。稍后给大家解释为什么要这样做。

目录截图

打开Setup.fla,在舞台上创建一个名为“info‘的动态文本。打开动作面板,输入下面的代码(当然也可以使用文档类):

const AIR_SWF_URL:String = "air.swf"; var airSWFLoader:Loader; var airSWF:Object; airSWFLoader = new Loader(); airSWFLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, handleAIRSWFInit); try { airSWFLoader.load(new URLRequest(AIR_SWF_URL)); } catch (e:*) { showInfo(e.toString()); } function handleAIRSWFInit(evt:Event):void { airSWF=airSWFLoader.content; switch(airSWF.getStatus()) { case "available": showInfo("需要先安装AIR,请不要关闭窗口"); fscommand("exec","AdobeAIRInstaller.exe"); addEventListener(Event.ENTER_FRAME,checkInstaller); break; case "unavailable": showInfo("运行时无法安装在此计算机上"); break; case "installed": showInfo("请在应用安装完毕后关闭窗口"); fscommand("exec","1.bat"); //airSWF.installApplication(appURL,airVersion); fscommand("quit","true"); break; } } function checkInstaller(e:Event):void { if(airSWF.getStatus() == "installed") { showInfo("请在应用安装完毕后关闭窗口"); fscommand("exec","1.bat"); //airSWF.installApplication(appURL,airVersion,null); fscommand("quit","true"); } } function showInfo(txt:String):void { info.text = txt; }

代码比较简单,大家可以看到所做的操作就是载入包含AIR API的SWF文件,然后调用getStatus()方法判断AIR运行时的安装情况,再根据安装情况做相应的处理。

  1. 如果没有安装运行时,则调取安装文件进行安装
  2. 如果不支持安装运行时,则终止一切操作
  3. 如果已安装运行时,则调用批处理文件安装你的AIR应用

大家可以看到,因为额外调用了一个批处理文件,造成弹出多余的界面,其实并不友好,但之所以这样做是因为API中包含的方法无法支持调取本地AIR文件的安装,大家可以看到我注释掉的一句://airSWF.installApplication(appURL,airVersion);这个方法只支持网络全路径的AIR文件安装,而如果是本地则会报错,大家可以测试一下,或许这是API不够完善的地方。

最后修改发布设置,发布出EXE文件,就可以测试运行了。

这种方式的缺陷也有很多,并没有做到完全的集成安装,而且还有命令窗口弹出,如果大家有更好的方式,欢迎指正与讨论。

使用道具 举报

本文评论

您需要登录后才可以回帖 登录 | 立即注册

Archiver|手机版|关于社区|九州瑞研|瑞研社区   

GMT+8, 2012-5-19 00:56 , Processed in 0.032818 second(s), 23 queries .

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部