我正在开发一个AIR应用程序,它需要在从网络中提取的swf上加载,运行和访问方法。使用moduals过去运行良好,但由于设计限制,此应用程序无法实现。下面你可以看到我加载ImageTest.swf然后在其上调用函数Bleh()的代码。
private var l:Loader = new Loader();
private var ctx:LoaderContext;
private function onInit():void
{
l.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoadComplete);
l.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,onLoadError);
l.load(new URLRequest("ImageTest.swf"));
}
private function onLoadError(event:IOErrorEvent):void
{
}
private function onLoadComplete(event:Event):void
{
ui.addChild(event.target.content);
SystemManager(event.target.content).addEventListener(FlexEvent.APPLICATION_COMPLETE, swfAppComplete);
}
private function swfAppComplete(event:FlexEvent):void
{
var sys:SystemManager = SystemManager(event.currentTarget);
var app:Object = sys.application;
app.Bleh();
}
当swf对AIR应用程序是本地的时,这很好用,但是当ImageTest.swf在服务器上关闭时,它会正常加载,但我得到一个强制运行时错误(TypeError:错误#1034:类型强制失败:不能将_Engine_mx_managers_SystemManager @ 7c36281转换为mx.managers.SystemManager):
SystemManager(event.target.content).addEventListener(FlexEvent.APPLICATION_COMPLETE, swfAppComplete);
我认为错误可能与安全沙箱问题有关,但我不确定。提前谢谢!
答案 0 :(得分:0)
它与安全问题有关,您的AIR应用程序具有APPLICATION Security沙箱,但加载的SWF没有。为了使其正常工作,您需要将SWF从网络下载到AIR应用程序中,然后使用“allowLoadBytesCodeExecution”选项重新加载它。
代码如下所示:
private function loadApp() : void {
var urlLoader : URLLoader = new URLLoader();
urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
urlLoader.addEventListener( Event.COMPLETE, onAppLoaded );
urlLoader.load( new URLRequest( url ) );
}
private function onAppLoaded( event : Event ) : void {
var appLoader : Loader = new Loader();
var context : LoaderContext = new LoaderContext();
// don't assign currentDomain as applicationDomain here
// it will UNABLE to unload swf later
context.applicationDomain = ApplicationDomain.currentDomain;
context.allowLoadBytesCodeExecution = true;
appLoader.contentLoaderInfo.addEventListener( Event.COMPLETE, onAppExecuted );
appLoader.loadBytes( ByteArray( ( event.currentTarget as URLLoader ).data ), context );
}
private function onAppExecuted( e : Event ) : void {
content = SystemManager( LoaderInfo( e.target ).content );
content.addEventListener( FlexEvent.APPLICATION_COMPLETE, onLoadedAppInitComplete );
}