2009-06-15 1 views
3

私は、ネットから取り込まれたswf上でメソッドをロード、実行、およびアクセスする必要があるAIRアプリケーションに取り組んでいます。 modualsを使用することは過去にはうまくいきましたが、設計上の制約のためにこのアプリケーションでは不可能です。下のコードを見ると、ImageTest.swfをロードしてからBleh()関数を呼び出します。Flex 3は、サーバーからロードするときにSystemManagerをSystemManagerに変換できません。

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:タイプ強制は失敗しました:mx.managers.SystemManagerに7c36281 @ _Engine_mx_managers_SystemManagerを変換することはできません)ラインで:

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

私は、エラーがセキュリティサンドボックスの問題に関連するかもしれないと考えているが、私はわかりません。前もって感謝します!

答えて

0

セキュリティ上の問題に関連しています。あなたのAIRアプリケーションにはアプリケーションセキュリティサンドボックスがありますが、SWFは読み込まれません。動作させるには、ネットワークからSWFをAIRアプリケーションにダウンロードしてから、「allowLoadBytesCodeExecution」オプションを使用してSWFをリロードする必要があります。

のコードは次のようになります。

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); 
    } 
関連する問題