【问题标题】: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);

【问题讨论】:

  • @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" 不起作用。

标签: actionscript-3 flash air


【解决方案1】:

这是一个典型的安全限制,但它是一个非常严格的限制,其目的是确保所提供的 swf 永远不会在最初的用途之外使用。

所以对您的问题的简短回答是:外部加载的 swf,使用“Security.allowDomain('*');”进行沙盒处理无论如何都不会允许沙盒 AIR 应用程序与它们交互。相反,这些 swf 将能够在限制下通过沙盒桥与父 AIR 应用程序交互。

如果您确实无法修改这些 swf,那么您将永远无法将它们添加到 AIR 应用程序的显示列表或调用它们的任何方法。沙盒桥对你也没有用。

我敢打赌,这不是你想听到的答案,但这是你唯一能得到的答案。

【讨论】:

    猜你喜欢
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 2012-03-31
    相关资源
    最近更新 更多