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 - 加载本地文本文件

加载初始内容Adobe air时出现ADL错误

带有自定义 jar 库的 adobe air 中的 NativeProcess

Adobe AIR 无法在 iOS 上加载 PDF

从带有AIR SDK 3.9的Adobe Flex SDK 4.6迁移到带有AIR SDK 3.9的Apache Flex SDK 4.12.0

Adobe Air - 从 IconItemRenderer 中的文件加载 PNG 图像