Flex 3,从服务器加载时无法将SystemManager转换为SystemManager?

时间:2009-06-15 20:09:02

标签: flex actionscript-3

我正在开发一个AIR应用程序,它需要在从网络中提取的swf上加载,运行和访问方法。使用moduals过去运行良好,但由于设计限制,此应用程序无法实现。下面你可以看到我加载ImageTest.swf然后在其上调用函数Bleh()的代码。

private var l:Loader = new Loader();
        private var ctx:LoaderContext;
        private function onInit():void
        {
            l.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoadComplete);                
            l.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,onLoadError);                
            l.load(new URLRequest("ImageTest.swf"));
        }

        private function onLoadError(event:IOErrorEvent):void
        {

        }

        private function onLoadComplete(event:Event):void
        {
            ui.addChild(event.target.content);
            SystemManager(event.target.content).addEventListener(FlexEvent.APPLICATION_COMPLETE, swfAppComplete);
        }

        private function swfAppComplete(event:FlexEvent):void
        {
            var sys:SystemManager = SystemManager(event.currentTarget);
            var app:Object = sys.application;
            app.Bleh();
        }

当swf对AIR应用程序是本地的时,这很好用,但是当ImageTest.swf在服务器上关闭时,它会正常加载,但我得到一个强制运行时错误(TypeError:错误#1034:类型强制失败:不能将_Engine_mx_managers_SystemManager @ 7c36281转换为mx.managers.SystemManager):

SystemManager(event.target.content).addEventListener(FlexEvent.APPLICATION_COMPLETE, swfAppComplete);

我认为错误可能与安全沙箱问题有关,但我不确定。提前谢谢!

1 个答案:

答案 0 :(得分:0)

它与安全问题有关,您的AIR应用程序具有APPLICATION Security沙箱,但加载的SWF没有。为了使其正常工作,您需要将SWF从网络下载到AIR应用程序中,然后使用“allowLoadBytesCodeExecution”选项重新加载它。

代码如下所示:

    private function loadApp() : void {
        var urlLoader : URLLoader = new URLLoader();
        urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
        urlLoader.addEventListener( Event.COMPLETE, onAppLoaded );
        urlLoader.load( new URLRequest( url ) );
    }

    private function onAppLoaded( event : Event ) : void {
        var appLoader : Loader = new Loader();
        var context : LoaderContext = new LoaderContext();
        // don't assign currentDomain as applicationDomain here
        // it will UNABLE to unload swf later 
        context.applicationDomain = ApplicationDomain.currentDomain;
        context.allowLoadBytesCodeExecution = true;
        appLoader.contentLoaderInfo.addEventListener( Event.COMPLETE, onAppExecuted );
        appLoader.loadBytes( ByteArray( ( event.currentTarget as URLLoader ).data ), context );
    }

    private function onAppExecuted( e : Event ) : void {
        content = SystemManager( LoaderInfo( e.target ).content );
        content.addEventListener( FlexEvent.APPLICATION_COMPLETE, onLoadedAppInitComplete );
    }