|
现在使用Adobe AIR技术开发应用的朋友越来越多了,不知大家是否想过这个问题,就是如何部署和安装你的应用?我们来简单分析一下Adobe为我们提供的两种方式:
- WEB部署安装的机制(即AIR Install Badge):在网络普及率很高的情况下这样的方式是很好的,在部署(包括跨平台)和版本控制上都很方便,但是假如用户没有联网条件,就不可行。
- 桌面分发:即通过把你的AIR安装包(.air文件)发给用户安装,但如果用户没有安装AIR的运行时,就无法安装,当然你可以再发给用户一个AIR运行时的安装包,写个说明让用户先安装AIR运行时,再安装你的应用,问题是这种繁琐的操作是极其破坏用户体验的。
那么引入今日的问题,即:
如果是情况2,是否可以将运行时和应用整合到一个安装包?
至少要让用户点击一个安装文件就可以完成整个的安装过程。仔细分析之后,原理上应该是可行的,原因如下:
- 可以通过Adobe提供的API判断用户是否安装了运行时
- 可以通过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运行时的安装情况,再根据安装情况做相应的处理。
- 如果没有安装运行时,则调取安装文件进行安装
- 如果不支持安装运行时,则终止一切操作
- 如果已安装运行时,则调用批处理文件安装你的AIR应用
大家可以看到,因为额外调用了一个批处理文件,造成弹出多余的界面,其实并不友好,但之所以这样做是因为API中包含的方法无法支持调取本地AIR文件的安装,大家可以看到我注释掉的一句://airSWF.installApplication(appURL,airVersion);这个方法只支持网络全路径的AIR文件安装,而如果是本地则会报错,大家可以测试一下,或许这是API不够完善的地方。
最后修改发布设置,发布出EXE文件,就可以测试运行了。
这种方式的缺陷也有很多,并没有做到完全的集成安装,而且还有命令窗口弹出,如果大家有更好的方式,欢迎指正与讨论。
|