2017-01-27 1 views
0

Ich habe ein AIR-Projekt, das eine beliebige swf lädt. Aber wenn der geladene swf einen SecurityError auslöst, kann ich diesen Fehler nicht behandeln! Mein Code ist unten:Wie behandelt man die SecurityError # 2070 und # 2000 in Loader.load()

var loader:Loader = new Loader(); 

_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, swfComplete); 
_loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, swfErrors); 
_loader.contentLoaderInfo.addEventListener(Event.INIT, swfInit); 
_loader.contentLoaderInfo.addEventListener(Event.OPEN, swfOpen); 
_loader.contentLoaderInfo.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatus); 
_loader.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR, swfSecurityError); 
_loader.contentLoaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, uncaughtErrors); 

try { 
    _loader.load(new URLRequest('path.swf')); 
} 
catch(e:SecurityError) { 
    trace("trying handle error!"); 
} 

function swfComplete(e:Event):void { 
    trace("complete"); 
} 

function swfErrors(e:IOErrorEvent):void { 
    trace("swf error: " + e.toString()); 
} 

function swfInit(e:Event):void { 
    trace("swf init"); 
} 

function swfOpen(e:Event):void { 
    trace("swf open. this listener dispatch!"); 
} 

function httpStatus(e:HTTPStatusEvent):void { 
    trace("http status: " + e.toString()); 
} 

function swfSecurityError(e:SecurityErrorEvent):void { 
    trace("trying handle security error. :("); 
} 

function uncaughtErrorEvent(e:UncaughtErrorEvent):void { 
    trace("uncaught error: " + e.toString()); 
} 

Die Ausnahmen von FlashDevelop:

[Fault] exception, information=SecurityError: Error #2070: Security sandbox violation: caller file.swf cannot access Stage owned by app:/myApp.swf.

[Fault] exception, information=SecurityError: Error #2000: No active security context.

Das Problem ist, dass mein Programm beendet und ich kann diesen Sicherheitsfehler nicht fangen. Wie kann ich verhindern, dass mein Programm geschlossen wird?

Antwort

2

Sie können diese Ausnahme nicht behandeln, da dies keine Verletzung der Laderoutine ist. Dies geschieht, wenn der geladene Inhalt versucht, auf die Bühne zuzugreifen (und aufgrund der Sandbox-Richtlinie nicht berechtigt ist, darauf zuzugreifen).

Sie (wahrscheinlich) lösen es in mehrfacher Hinsicht:

  1. Laden Sie Ihre Datei als binäre Daten über URLLoader und dann Loader.loadBytes es. Somit werden Ihre Inhalte innerhalb derselben Sandbox als intern betrachtet und haben vollen Zugriff auf Ihre gesamte Anwendung.
  2. Behandeln Sie die Ausnahme: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/events/UncaughtErrorEvent.html
  3. dass SWF als zusätzliche Datei zu Ihren App hinzufügen, so dass es in dem gleichen Ordner wie SWF-Haupt und wird in die gleiche Sandbox zu laden. Kann ich nicht sicher sagen, denn ich habe nie AIR-Apps von FD veröffentlicht.
+0

Danke für die Beantwortung. Ich habe loadBytes als Lösung versucht, weil die anderen ich nicht umsetzen kann. Ich habe es getan, aber es gibt ein Problem. Ich lade eine Reihe von Dateien, die später "unloadAndStop" verwenden, um sie aus dem Speicher zu entladen, jedoch entfernt dieser Befehl nicht alle Bytes aus der geladenen Datei. Dies liegt möglicherweise an den Definitionen von Klassen, die in mein Haupt-SWF eingebettet sind. Was passiert ist, dass mein Programm Speicherverbrauch erhöht und abstürzt. Wie kann ich das lösen? – bio

+0

Sprechen Sie über Hunderte (oder mindestens zehn) Megabyte? Sie können versuchen, alle auf einmal zu laden und zu sehen. Oder Sie können beschreiben, wofür Ihr geladener Inhalt benötigt wird, und versuchen, ihn neu zu programmieren, so dass er keinen Zugriff auf die Bühne oder irgendeine Umgebung benötigt und diese daher regelmäßig lädt und entlädt. – Organis

Verwandte Themen