Flex 3, не можете конвертировать SystemManager в SystemManager при загрузке с сервера? - PullRequest
3 голосов
/ 16 июня 2009

Я работаю над приложением AIR, которое нуждается в загрузке, запуске и доступе к методам на SWF, извлеченном из сети. Использование модулей в прошлом хорошо работало, но из-за конструктивных ограничений для этого приложения это невозможно. Ниже вы можете увидеть код, в который я загружаю 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 на сервере отключен, он загружается нормально, но я получаю ошибку времени выполнения принудительного действия (Ошибка типа: Ошибка # 1034: Ошибка приведения типа: невозможно преобразовать _Engine_mx_managers_SystemManager @ 7c36281 в mx.managers.SystemManager) в строке:

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

Я полагаю, что ошибка может быть связана с проблемой изолированной программной среды, но я не уверен. Заранее спасибо!

1 Ответ

0 голосов
/ 20 февраля 2010

Это связано с проблемой безопасности, ваше приложение 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 );
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...