Править: Из-за ответа я изменяю отправленный код. Я добавил Security.allowDomain("*")
строка и та строка бросают меня ошибка. Так, как это может быть сделано?
Я хочу запустить Приложение Сценария 3.0 Действия в Приложение Flex. Чтобы сделать это, я сделал следующее:
<?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>
Проблема состоит в том что в вызове swfApplication.init();
Плеер AIR бросает меня исключение:
Нарушение тестовой среды безопасности: вызывающая сторона file:///path/to/the/application.swf не может получить доступ к Этапу, принадлежавшему app:/SWFApplicationLoader.swf.
Это вызвано тем, что где-нибудь в application.swf
Я использую этап как это:
if (root.stage != null)
root.stage.addEventListener(Event.REMOVED, someFunction);
root.stage.stageFocusRect = false;
Как я могу загрузить это swf приложение и ИСПОЛЬЗОВАТЬ этап без каких-либо проблем?
Вы можете попробовать загрузить свой SWF
временно в ByteArray
, а затем загрузить его с помощью SWFLoader
.
Не забудьте установить для allowCodeImport
значение true, поскольку ваш SWF-файл содержит код внутри.
Конечно, убедитесь, что загруженный swf-файл достаточно безопасен для вашего приложения, поскольку он будет иметь доступ ко всей вашей собственности.
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.allowCodeImport=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
}
Если они загружаются из разных доменов, вам придется добавить исключение безопасности - http://livedocs.adobe.com/flex/3/html/help.html?content=05B_Security_08.html
если он запускается локально, вам, вероятно, придется добавить их в список доверенных файлов или папок в диспетчере настроек - http://www.macromedia.com/support/documentation/en/flashplayer/ help / settings_manager04.html # 117502
Предполагая, что внешний SWF-файл также находится в каталоге приложения, вы можете попробовать загрузить его, используя схему app: /
:
var urlRequest:URLRequest = new URLRequest("app:/path/application.swf");
Это может поместить его в тот же контекст безопасности, что и основное приложение.