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

现在使用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”的动态文本。打开动作面板,输入下面的代码(当然也可以使用文档类):

  1. const AIR_SWF_URL:String = "air.swf";
  2. var airSWFLoader:Loader;
  3. var airSWF:Object;
  4. airSWFLoader = new Loader();
  5. airSWFLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, handleAIRSWFInit);
  6. try {
  7. airSWFLoader.load(new URLRequest(AIR_SWF_URL));
  8. } catch (e:*) {
  9. showInfo(e.toString());
  10. }
  11. function handleAIRSWFInit(evt:Event):void {
  12. airSWF=airSWFLoader.content;
  13. switch(airSWF.getStatus()) {
  14. case "available":
  15. showInfo("需要先安装AIR,请不要关闭窗口");
  16. fscommand("exec","AdobeAIRInstaller.exe");
  17. addEventListener(Event.ENTER_FRAME,checkInstaller);
  18. break;
  19. case "unavailable":
  20. showInfo("运行时无法安装在此计算机上");
  21. break;
  22. case "installed":
  23. showInfo("请在应用安装完毕后关闭窗口");
  24. fscommand("exec","1.bat");
  25. //airSWF.installApplication(appURL,airVersion);
  26. fscommand("quit","true");
  27. break;
  28. }
  29. }
  30. function checkInstaller(e:Event):void {
  31. if(airSWF.getStatus() == "installed") {
  32. showInfo("请在应用安装完毕后关闭窗口");
  33. fscommand("exec","1.bat");
  34. //airSWF.installApplication(appURL,airVersion,null);
  35. fscommand("quit","true");
  36. }
  37. }
  38. function showInfo(txt:String):void {
  39. info.text = txt;
  40. }

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

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

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

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

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

riadevID: 
您给予的分值: None 平均分: 9.5 ( 4 票)

更好的解决方案

实际上Adobe已经准备好了解决方案,步骤如下:

1.到Adobe AIR的下载页面,有个“分发...“的链接,点过去,出现分发的用户协议
2.签署协议,提交分发AIR运行时的申请,Adobe会在3个工作日之内回复
3.申请通过,Adobe会发送给你集成AIR安装文件的下载链接
4.按照说明,将你的应用和AIR安装包绑定在一起,即可实现硬盘上的无缝安装

看到了,很牛,我也注册了,谢谢了!

发表新评论

  • 网页地址和电子邮件地址将会被自动转换为链接。
  • 行和段被自动切分。
  • 您可以使用下面的标签来高亮显示您的评论内容: <code>, <blockcode>. 可以使用"[foo]".旁边显示标签样式 "<foo>" PHP代码可以用这样的区块来包含<?php ... ?> or <% ... %>

更多格式化选项信息

验证区域
系统验证:请回答下面的问题