没有用户交互就没有执行Actionscript代码

时间:2011-09-27 16:13:36

标签: flash flex actionscript air

以下代码按预期工作:当用户单击该按钮时,安装程​​序会自动启动。

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
               creationComplete="applicationInit(event)">

<fx:Script>
    <![CDATA[
        import flash.utils.setTimeout;

        import mx.events.FlexEvent;

        private var airSWF:Object;
        private var airSWFLoader:Loader = new Loader();
        private var loaderContext:LoaderContext = new LoaderContext(); 

        private function applicationInit(event:FlexEvent):void {
            this.loaderContext.applicationDomain = ApplicationDomain.currentDomain;
            this.airSWFLoader.contentLoaderInfo.addEventListener(Event.INIT, onAirInit);
            this.airSWFLoader.load(new URLRequest("http://airdownload.adobe.com/air/browserapi/air.swf"), loaderContext);
        }

        private function onAirInit(event:Event):void {
            this.airSWF = event.target.content;
            this.button.addEventListener(MouseEvent.CLICK, installApp);
        }

        private function installApp(event:MouseEvent):void {
            var url:String = "URL HERE";
            var runtimeVersion:String = "2.7";
            var arguments:Array = ["launchFromBrowser"];
            this.airSWF.installApplication(url, runtimeVersion, arguments);
        }
    ]]>
</fx:Script>

<s:Button id="button" label="Download" horizontalCenter="0" verticalCenter="0"/>
</s:Application>

然而,令人惊讶的是,以下代码无法按预期工作:它在创建时不会启动安装程序。

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
               creationComplete="applicationInit(event)">

<fx:Script>
    <![CDATA[
        import flash.utils.setTimeout;

        import mx.events.FlexEvent;

        private var airSWF:Object;
        private var airSWFLoader:Loader = new Loader();
        private var loaderContext:LoaderContext = new LoaderContext(); 

        private function applicationInit(event:FlexEvent):void {
            this.loaderContext.applicationDomain = ApplicationDomain.currentDomain;
            this.airSWFLoader.contentLoaderInfo.addEventListener(Event.INIT, onAirInit);
            this.airSWFLoader.load(new URLRequest("http://airdownload.adobe.com/air/browserapi/air.swf"), loaderContext);
        }

        private function onAirInit(event:Event):void {
            this.airSWF = event.target.content;
            installApp();
        }

        private function installApp():void {
            var url:String = "URL HERE";
            var runtimeVersion:String = "2.7";
            var arguments:Array = ["launchFromBrowser"];
            this.airSWF.installApplication(url, runtimeVersion, arguments);
        }
    ]]>
</fx:Script>

<s:Button id="button" label="Download" horizontalCenter="0" verticalCenter="0"/>
</s:Application>

我确认已执行installApp功能。

为什么第二段代码不起作用?是否需要用户交互?如果是这样的话有什么办法吗?

1 个答案:

答案 0 :(得分:1)

是的,AIR安装程序需要用户交互(用户事件)才能工作。不幸的是,我似乎无法找到关于此的官方信息,但我在过去遇到过这个问题。出于安全原因,它是以这种方式构建的,因此任何应用都无法在后台安装不需​​要的应用。

编辑:找到它:http://livedocs.adobe.com/flex/3/html/help.html?content=distributing_apps_3.html

  

从浏览器安装AIR应用程序

     

SWF文件可以通过调用来安装AIR应用程序   从加载的air.swf文件中的installApplication()方法   http://airdownload.adobe.com/air/browserapi/air.swf。有关详情,请参阅   加载air.swf文件。

     

[...]

     

installApplication()方法只能在调用时运行   用户事件的事件处理程序,例如鼠标单击。

     

如果需要,installApplication()方法会抛出错误   版本的Flash Player(版本9升级3)未安装在   浏览器。