2017-01-27 2 views
0

У меня есть проект AIR, который загружает любой swf. Но когда загруженный swf отправляет SecurityError, я не могу справиться с этой ошибкой! Мой код ниже:Как обращаться с SecurityError # 2070 и # 2000 в 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()); 
} 

Исключение из 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.

Проблема заключается в том, что моя программа завершает работу, и я не могу поймать эти ошибки безопасности. Как я могу предотвратить закрытие моей программы?

ответ

2

Вы не можете обработать это исключение, потому что это не является нарушением режима загрузки. Это происходит, когда загруженный контент пытается получить доступ к сцене (и не имеет права доступа к нему из-за политики песочницы).

Вы можете (вероятно) решить несколькими способами:

  1. Загрузите файл как двоичные данные через URLLoader, а затем Loader.loadBytes его. Таким образом, ваш контент будет считаться внутренним в одной песочнице, и он будет иметь полный доступ ко всему вашему приложению.
  2. Обращение с исключением: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/events/UncaughtErrorEvent.html
  3. Добавьте этот SWF в качестве дополнительного файла в приложение, чтобы оно находилось в той же папке, что и основной SWF, и будет загружаться в одну и ту же песочницу. Не могу сказать точно, что я никогда не публиковал приложения AIR из FD.
+0

Благодарим за ответ. Я попробовал loadBytes как решение, потому что другие, которые я не могу реализовать на практике. Я сделал это, но есть проблема. Я загружаю серию файлов, которые позже используют «unloadAndStop», чтобы выгрузить их из памяти, однако эта команда не удаляет все байты из загруженного файла. Возможно, это связано с определениями классов, встроенных в мой основной swf. Случается, что моя программа увеличивает потребление памяти и сбои. Как я могу это решить? – bio

+0

Вы говорите о сотнях (или, по крайней мере, десятках) мегабайт? Вы можете попробовать загрузить их все сразу и посмотреть. Или вы можете описать, на каком этапе загрузки загружен контент, и попытаться перепрограммировать его, чтобы он не нуждался в доступе к сцене или какой-либо среде, таким образом загружая и выгружая их обычным способом. – Organis

Смежные вопросы