2017-01-27 10 views
0

SWF를로드하는 AIR 프로젝트가 있습니다. 하지만로드 된 swf가 SecurityError를 전달하면이 오류를 처리 할 수 ​​없습니다! 내 코드는 우는 소리입니다 :에 FlashDevelop에서Loader.load()에서 SecurityError # 2070 및 # 2000을 처리하는 방법

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()); 
} 

예외 :

[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가 기본 SWF와 동일한 폴더에 있으므로 동일한 샌드 박스에도로드됩니다. FD에서 AIR 응용 프로그램을 게시 한 적이 없다는 것을 확실히 말할 수는 없습니다.
+0

답변 해 주셔서 감사합니다. 솔루션으로 loadBytes를 시도했는데 다른 것들은 연습 할 수 없기 때문입니다. 나는 해냈지만 문제가있다. 나중에 "unloadAndStop"을 사용하여 메모리에서 언로드하는 일련의 파일을로드하지만이 명령은로드 된 파일에서 모든 바이트를 제거하지 않습니다. 이것은 아마도 내 주 swf에 포함 된 클래스의 정의 때문일 수 있습니다. 내 프로그램이 메모리 소비와 충돌을 증가 시킨다는 것이 발생합니다. 이 문제를 어떻게 해결할 수 있습니까? – bio

+0

당신은 수백 메가 바이트 (또는 적어도 수십 메가 바이트)에 대해 이야기하고 있습니까? 한꺼번에로드하여 볼 수 있습니다. 또는로드 된 컨텐츠가 무엇을 필요로하는지 설명하고이를 다시 프로그래밍하여 무대 또는 환경에 액세스 할 필요가 없으므로 일반 방식으로로드 및 언로드 할 수 있습니다. – Organis