Adobe Air 加载内部带有 allowDomain('*') 的外部 swf
Posted
技术标签:
【中文标题】Adobe Air 加载内部带有 allowDomain(\'*\') 的外部 swf【英文标题】:Adobe Air loading external swf with allowDomain('*') insideAdobe Air 加载内部带有 allowDomain('*') 的外部 swf 【发布时间】:2016-03-13 01:20:09 【问题描述】:我有什么
大量 swfs 没有它的来源(所以我无法修改它)
我需要什么
用我的 AIR 应用加载和播放这个 swfs。
问题
问题是这个 swfs 似乎有
Security.allowDomain('*')
在他们的源代码中,所以他们会抛出
SecurityError:错误 #3207:应用程序沙盒内容无法访问 这个功能。
在我加载它之后。我知道 Air 不需要使用这条线,但我的完整应用程序不会在加载其中一个 swf 后停止执行,而不是忽略或警告它。如果我可以尝试/捕获这个字符串,但正如我所说,我没有那个 swfs 的来源,所以我唯一能做的就是修改我的 AIR 应用程序。
我尝试了什么
我已经尝试过通过做来捕获加载器中的所有错误
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, loaderIOErrorHandler);
private function loaderIOErrorHandler(e:IOErrorEvent):void
e.preventDefault();
但它似乎根本没有在加载程序中捕获错误
更新
我无法分享其中一个 swf,但这是我制作的模拟问题,用于重现问题 https://www.dropbox.com/s/0spbdzijfpboi47/problematicSwf.swf?dl=0
这里是初始化代码
private function init(e:Event = null):void
removeEventListener(Event.ADDED_TO_STAGE, init);
Security.allowDomain('*');
tf = new TextField();
tf.text = 'Me loaded!';
addChild(tf);
如您所见,它在加载的 swf 内的 allowDomain 上崩溃。 这是我加载它的方式
var ctx:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaded);
loader.load(new URLRequest(path), ctx);
【问题讨论】:
看看uncaughtErrorEvents ... @akmozo 谢谢你的回答。我在处理程序中尝试了loader.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, uncaughtErrorHandler);
和loader.contentLoaderInfo.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, uncaughtErrorHandler);
和event.preventDefautl()
,但是没有任何工作和异常仍然会中断执行而不进入处理程序(我在处理程序内的跟踪不会发生)
loader.uncaughtErrorEvents.addEventListener(UncaughtErrorEvent.UNCAUGHT_ERROR, uncaughtErrorHandler)
应该可以工作!您确定该错误是从您加载的 SWF 中触发的吗?尝试提供有关该错误的更多详细信息,如果有可能,您能分享其中一个 SWF 吗?
try catch(e:UNCAUGHT_ERROR) 语句?
@quantomworks 感谢您的回答。正如我在问题中所说,我无法修改外部 swfs 的来源,因此没有机会在其中添加 try catch。我所能做的就是修改 AIR 应用程序代码,但是当加载器执行代码时,异步 try catch "loader.load" 不起作用。
【参考方案1】:
这是一个典型的安全限制,但它是一个非常严格的限制,其目的是确保所提供的 swf 永远不会在最初的用途之外使用。
所以对您的问题的简短回答是:外部加载的 swf,使用“Security.allowDomain('*');”进行沙盒处理无论如何都不会允许沙盒 AIR 应用程序与它们交互。相反,这些 swf 将能够在限制下通过沙盒桥与父 AIR 应用程序交互。
如果您确实无法修改这些 swf,那么您将永远无法将它们添加到 AIR 应用程序的显示列表或调用它们的任何方法。沙盒桥对你也没有用。
我敢打赌,这不是你想听到的答案,但这是你唯一能得到的答案。
【讨论】:
以上是关于Adobe Air 加载内部带有 allowDomain('*') 的外部 swf的主要内容,如果未能解决你的问题,请参考以下文章
ActionScript 3 Adobe AIR - 加载本地文本文件
带有自定义 jar 库的 adobe air 中的 NativeProcess
从带有AIR SDK 3.9的Adobe Flex SDK 4.6迁移到带有AIR SDK 3.9的Apache Flex SDK 4.12.0