문제

현재 표준 AS3 응용 프로그램과 공기 응용 프로그램에서 외부 SWF 파일을로드하는 실험을 진행하고 있습니다. Air Application은 Flash Player가 실행하는 표준 SWF와 같은 방식으로 작동하지 않는 것 같습니다.

에 따르면 선적 서류 비치,, applicationDomain 의 자산 LoaderContext 공기 애플리케이션에서도 사용할 수 있지만 작동하지 않는 것 같습니다.

다음 코드가 있습니다.

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

그러나 공기 응용 프로그램과 동일한 코드는 다른 출력을 수행합니다.

Child One parentDomain : null
Invoker parentDomain   : null
Child One has Invoker  : false
Invoker has Invoker    : true

문서에 따르면 첫 번째 출력 (Air Application이 아닌 Flash Player가있는 SWF 사용)이 올바른 것입니다. 또한이 스 니펫을 사용하여 재생하고 응용 프로그램 도메인을 다른 구성으로 변경할 수있는 구성 (예 : new ApplicationDomain(null), 또는 ApplicationDomain.currentDomain)는 SWF와 함께 문서의 말을 악화 시키지만 공기 응용 프로그램의 출력을 변경하지는 않습니다.

공기가 단순히 로더 컨텍스트로 전달 된 응용 프로그램 도메인을 무시하는 이유는 무엇입니까? 이 특정 문제에 대한 문서가 있습니까?

매우 감사합니다.

도움이 되었습니까?

해결책

알았어요.

문제는 다른 행동으로 인해 발생했습니다. SecurityDomain 공기 응용 프로그램 내에서 시스템. SWF 파일이 공기 애플리케이션 내에로드되면 항상 다른 샌드 박스에 따라 다릅니다. 따라서 Air는 새로운 것을 만듭니다 SecurityDomain 이 SWF를 위해.

a SecurityDomain 하나 이상의 그룹입니다 ApplicationDomainS,이 행동은 새로운 것을 만들었습니다. ApplicationDomain (새로운 내에서 SecurityDomain), 지정된 것을 무시합니다 ( '메인'에 속합니다. SecurityDomain).

해결 방법이 있습니다 URLLoader. 바이트 코드에서로드 된 경우 (사용 Loader.loadBytes), SWF는 동일하게로드됩니다 SecurityDomain. 이것이 당신이 넣어야하는 이유입니다 allowLoadBytesCodeExecution 사실, 안전하지 않을 수 있기 때문입니다. 따라서 SWF를 간접적으로로드하면 먼저 URLLoader, 그리고 그와 함께 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"));
        }
    }
}

도움이 되었기를 바랍니다.

다른 팁

그것은 좋은 것입니다, 고맙습니다 :)

더 자세한 세부 사항 : 허용 bytescodeexecution 이제 레거시 속성이며 Air 1.0에서 정의되었습니다. AIR 2.0에서 사용합니다 allowcodeimport 대신에.

Ciao, pg

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top