Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flex LoaderContext和ApplicationDomain随AdobeAIR的变化?_Apache Flex_Flash_Actionscript 3_Air - Fatal编程技术网

Apache flex LoaderContext和ApplicationDomain随AdobeAIR的变化?

Apache flex LoaderContext和ApplicationDomain随AdobeAIR的变化?,apache-flex,flash,actionscript-3,air,Apache Flex,Flash,Actionscript 3,Air,我目前正在试验从标准AS3应用程序和AIR应用程序加载外部SWF文件。AIR应用程序的运行方式似乎与Flash播放器运行的标准SWF不同 根据,LoaderContext的applicationDomain属性在AIR应用程序中也可用,但它似乎不起作用 我有以下代码: package { import flash.display.Loader; import flash.display.LoaderInfo; import flash.display.Sprite;

我目前正在试验从标准AS3应用程序和AIR应用程序加载外部SWF文件。AIR应用程序的运行方式似乎与Flash播放器运行的标准SWF不同

根据,LoaderContext的
applicationDomain
属性在AIR应用程序中也可用,但它似乎不起作用

我有以下代码:

package {
    import flash.display.Loader;
    import flash.display.LoaderInfo;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.net.URLRequest;
    import flash.system.ApplicationDomain;
    import flash.system.LoaderContext;

    public class Invoker extends Sprite
    {
        private var _ldr : Loader;

        public function Invoker()
        {
            _ldr = new Loader();
            _ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, onChildOneComplete);

            var ldrC : LoaderContext = new LoaderContext(false,
                new ApplicationDomain(ApplicationDomain.currentDomain)
            );

            _ldr.load(new URLRequest("otherSwf.swf"), ldrC);
        }

        private function onChildOneComplete(e : Event) : void
        {
            var c1ad : ApplicationDomain = (e.target as LoaderInfo).applicationDomain;
            var inad : ApplicationDomain = ApplicationDomain.currentDomain;

            trace("Child One parentDomain : " + c1ad.parentDomain);
            trace("Invoker parentDomain   : " + inad.parentDomain);

            trace("Child One has Invoker  : " + c1ad.hasDefinition("Invoker"));
            trace("Invoker has Invoker    : " + inad.hasDefinition("Invoker"));
        }
    }
}
将此代码编译为SWF文件,并使用Flash Player启动它,会产生以下输出,这似乎是正确的:

Child One parentDomain : [object ApplicationDomain]
Invoker parentDomain   : null
Child One has Invoker  : true
Invoker has Invoker    : true
但与AIR应用程序相同的代码具有不同的输出:

Child One parentDomain : null
Invoker parentDomain   : null
Child One has Invoker  : false
Invoker has Invoker    : true
根据文档,第一个输出(使用带Flash Player的SWF,而不是AIR应用程序)是正确的。此外,使用此代码片段并将应用程序域更改为其他可能的配置(如
new ApplicationDomain(null)
,或
ApplicationDomain.currentDomain
)确实符合文档中对SWF的说明,但不会更改AIR应用程序的输出

为什么AIR只是忽略传递给加载程序上下文的应用程序域?有关于这个问题的文件吗

非常感谢。

明白了

该问题是由AIR应用程序中的
SecurityDomain
系统中的不同行为引起的。在AIR应用程序中加载SWF文件时,它始终依赖于不同的沙箱。因此,AIR为此SWF创建了一个新的
SecurityDomain

由于
SecurityDomain
是一个或多个
ApplicationDomain
的组,因此此行为强制创建新的
ApplicationDomain
(在新的
SecurityDomain
中),忽略指定的域(属于“主”
SecurityDomain

使用
URLLoader
有一种解决方法。从字节码加载时(使用
Loader.loadBytes
),SWF加载在同一
SecurityDomain
中。这就是为什么您必须将
allowLoadBytesCodeExecution
设置为true,因为它可能不安全。因此,首先通过
urloader
间接加载SWF,然后使用
Loader.loadBytes
解决这个问题

以下是片段:

package {
    import flash.display.Loader;
    import flash.display.LoaderInfo;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.net.URLLoader;
    import flash.net.URLLoaderDataFormat;
    import flash.net.URLRequest;
    import flash.system.ApplicationDomain;
    import flash.system.LoaderContext;
    import flash.utils.ByteArray;

    public class Invoker extends Sprite
    {
        public function Invoker()
        {
            var uldr : URLLoader = new URLLoader();
            uldr.dataFormat = URLLoaderDataFormat.BINARY;
            uldr.addEventListener(Event.COMPLETE, onBytesComplete);

            uldr.load(new URLRequest("otherSwf.swf"));
        }

        private function onBytesComplete(e : Event) : void
        {
            var bytes : ByteArray = (e.target as URLLoader).data;

            var ldr : Loader = new Loader();
            ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, onChildComplete);

            var ldrC : LoaderContext = new LoaderContext();

            // This property was for AIR 1.0.
            //ldrC.allowLoadBytesCodeExecution = true;

            // Since AIR 2.0, it's allowCodeImport.
            ldrC.allowCodeImport = true;

            ldr.loadBytes(bytes, ldrC);
        }

        private function onChildComplete(e : Event) : void
        {
            var c1ad : ApplicationDomain = (e.target as LoaderInfo).applicationDomain;
            var inad : ApplicationDomain = ApplicationDomain.currentDomain;

            trace("Child One parentDomain : " + c1ad.parentDomain);
            trace("Invoker parentDomain   : " + inad.parentDomain);

            trace("Child One has Invoker  : " + c1ad.hasDefinition("Invoker"));
            trace("Invoker has Invoker    : " + inad.hasDefinition("Invoker"));
        }
    }
}
希望这有帮助。

这是一个很好的建议,thanx:)

还有一个细节:allowLoadBytesCodeExecution现在是一个遗留属性,它是在AIR 1.0中定义的。从AIR 2.0开始使用允许代码导入

再见,
PG

注意,您需要使用@pigiuz所说的[allowCodeImport]