2010-04-26 12 views
5

EDIT: Durch die Antwort, die ich den Code geschrieben ändern. Ich habe dieSecurity.allowDomain("*")Zeile hinzugefügt und diese Linie wirft mir einen Fehler. Also, wie kann das gemacht werden?Wie führe ich eine externe SWF in einer Flex-Anwendung aus?

Ich will ein Action Script 3.0-Anwendung in eine Flex-Anwendung auszuführen. Um dies zu tun ich folgendes getan:

<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication windowComplete="loadSwfApplication()" xmlns:mx="http://www.adobe.com/2006/mxml"> 

    <mx:Script> 
     <![CDATA[ 
      private function loadSwfApplication() 
      { 
       // The next line throws me an error. 
       Security.allowDomain("*"); 

       var urlRequest:URLRequest = new URLRequest("path/to/the/application.swf"); 
       swfLoader.addEventListener(Event.COMPLETE, loadComplete); 
       swfLoader.load(urlRequest); 
      } 

      private function loadComplete(completeEvent:Event) 
      { 
       var swfApplication:* = completeEvent.target.content; 
       swfApplication.init(); // this is a Function that I made it in the Root class of swfApplication 
      } 
     ]]> 
    </mx:Script> 

    <mx:SWFLoader id="sfwLoader"/> 

</mx:WindowedApplication> 

Das Problem ist, dass in der Berufung swfApplication.init(); der AIR-Spieler wirft mich eine Ausnahme:

Sicherheits-Sandbox-Verletzung: Aufrufer file: /// Pfad /to/the/application.swf kann nicht auf die Stage im Besitz der App: /SWFApplicationLoader.swf zugreifen.

Dies liegt daran, irgendwo in application.swf ich die Bühne wie folgt verwenden:

if (root.stage != null) 
    root.stage.addEventListener(Event.REMOVED, someFunction); 
root.stage.stageFocusRect = false; 

Wie kann ich diese swf-Anwendung geladen werden und die Bühne nutzen, ohne Probleme?

Antwort

18

Sie können versuchen, Ihre SWF vorübergehend in eine ByteArray zu laden und dann laden Sie sie mit Ihrer SWFLoader.

Vergessen Sie nicht allowLoadBytesCodeExecution auf true gesetzt, da die SWF innerhalb als Code.

Natürlich sicher sein, dass Ihre geladene swf ist sicher genug für Ihre Anwendung, da sie Zugriff auf alle Ihre Immobilie haben.

private function loadSwfApplication():void { 
    // load the file with URLLoader into a bytearray 
    var loader:URLLoader=new URLLoader(); 

    // binary format since it a SWF 
    loader.dataFormat=URLLoaderDataFormat.BINARY; 
    loader.addEventListener(Event.COMPLETE, onSWFLoaded); 

    //load the file 
    loader.load(new URLRequest("path/to/the/application.swf")); 
} 
private function onSWFLoaded(e:Event):void { 
// remove the event 
var loader:URLLoader=URLLoader(e.target); 
loader.removeEventListener(Event.COMPLETE, onSWFLoaded); 

// add an Application context and allow bytecode execution 
var context:LoaderContext=new LoaderContext(); 
context.allowLoadBytesCodeExecution=true; 

// set the new context on SWFLoader 
sfwLoader.loaderContext = context; 

sfwLoader.addEventListener(Event.COMPLETE, loadComplete); 

// load the data from the bytearray 
sfwLoader.load(loader.data); 
} 

// your load complete function 
private function loadComplete(completeEvent:Event):void { 
var swfApplication:* = completeEvent.target.content; 
swfApplication.init(); // this is a Function that I made it in the Root 
         // class of swfApplication 
} 
+0

Funktioniert das auch auf mobilen Plattformen? Wenn ja, können Sie einen Flash Player für iOS schreiben. – sydd

+0

Eine Idee, warum dies mit einem Byte-Array funktioniert, aber nicht mit der swfloader-Komponente? – buddyp450

2

Wenn sie von verschiedenen Domains geladen werden Sie eine Sicherheitsausnahme hinzufügen gehen zu müssen, um - http://livedocs.adobe.com/flex/3/html/help.html?content=05B_Security_08.html

Wenn es lokal ausgeführt werden youre wahrscheinlich sie in der Liste der vertrauenswürdigen Dateien oder Ordner gehen zu müssen hinzufügen der Einstellungsmanager - http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager04.html#117502

+0

Wenn ich versuche, fügen Sie die Sicherheitsausnahme hinzu, es wirft mir einen Fehler: 'SecurityError: Fehler # 3207: Application-Sandbox-Inhalt kann nicht auf diese Feature zugreifen. \t bei flash.system :: Security $/allowDomain() ' –

+0

Und es ist bereits zu den vertrauenswürdigen Dateien im Einstellungsmanager hinzugefügt. –

1

Unter der Annahme, dass die externe SWF ist auch im Anwendungsverzeichnis, können Sie es Laden versuchen, das app:/ Schema verwendet:

var urlRequest:URLRequest = new URLRequest("app:/path/application.swf"); 

das mag versetzen Sie es in denselben Sicherheitskontext wie die Hauptanwendung.

0

Eine Sache, die Sie betrachten wünschen können, ist, dass, wenn Sie versuchen, eine SWF aus Ihrem Anwendungsverzeichnis in AIR ausgeführt werden, AIR Ausführung von Dateien einschränkt. Wenn Sie die Datei in eine temporäre Datei kopieren und ausführen (zusammen mit allowLoadBytesCodeExecution auf true), funktioniert es.

var file:File = File.applicationDirectory.resolvePath("myFile.swf"); 
this.tmpFile = File.createTempDirectory().resolvePath("myFile.swf"); 
file.copyTo(this.tmpFile); 

imagePreview.loaderContext = lc; 
imagePreview.source = tmpFile.url; 
0

es wird nicht für Flex-Projektoren funktionieren.

Nur verwenden wir SWFLoader und Localconnection, weil sie zwischen externen swf und Haupt-swf kommunizieren können. Danke für die Unterstützung!

Können Sie lesen mein Tutorial von Adobe's Forum

Es ist sehr besser als MovieClip- oder Objekt-Callers

Dank für aufgelöste Lösung :)

Mit freundlichen Grüßen, Jens