【问题标题】:Loading external SWFs into an Adobe AIR application - Best Practices?将外部 SWF 加载到 Adob​​e AIR 应用程序 - 最佳实践?
【发布时间】:2011-10-18 17:09:42
【问题描述】:

我最近接到了一项任务,将现有的基于 Flash Player 的游戏移植到桌面应用程序中,以便在 Steam 平台上发布。 Adobe AIR 框架似乎是分发的合乎逻辑的选择,尤其是考虑到 AIR 3 的最新更新。鉴于我对 flash/flex 开发相对较新,我已经阅读了大量关于 Adob​​e 的 AIR 文档站点,以便更好地了解任务涉及的内容。总的来说,我认为我对需要发生的事情有一个不错的想法,但是有一些问题可能会影响是否/如何甚至可以移植到 AIR 框架:

  1. 由于客户端开发的周转时间很快,AIR 应用程序需要从外部服务器加载实际的游戏客户端。
  2. 由于 AIR 应用程序将部署在 Steam 上,我想使用 AIR 3.0 中提供的 Captive Runtime 捆绑,即无需用户“确定”单独的 AIR 安装。
  3. 对外部 SWF 中的代码更改影响最小,因为我不是游戏的主要开发人员。

我的首要任务是找出将外部游戏客户端 SWF 加载到 AIR 应用程序的最佳方法。最初,我尝试使用 Loader.load(),但这导致了以下异常:

SecurityError: Error #2070: Security sandbox violation: caller http://localhost/MyClient.swf cannot access Stage owned by app:/AS3_AIRTest.swf.
    at flash.media::SoundMixer$/set soundTransform()
    at com.company.client.sound::SFXManager$/load()
    at global/client.util::loadEmbeddedSounds()
    at MyClient()

违规代码是:

static public function load():void {
    SoundMixer.soundTransform = 
        new SoundTransform(Client.Settings.PlaySFX ? 1 : 0);
}

在遇到此异常时,我决定进一步了解 AIR / Flash 播放器安全域。我对异常发生的原因有了更清晰的了解,但我仍然不确定加载 SWF 而不收到上述异常的最佳方法是什么。

在浏览了各种论坛上的大量帖子后,我发现许多开发人员使用 Loader.loadBytes() 将 SWF 带入应用程序沙箱。从易于实施的角度来看,我可以看到为什么许多人选择走这条路;但是,我不倾向于采用这种方法,因为如果外部服务器受到威胁,会对用户系统造成潜在危险。

我读到的第二种方法是我可以利用沙盒脚本桥,并编写一个接口来授予外部客户端 SWF 某些权限。我现在犹豫要不要走这条路,因为游戏客户端相当复杂,而且我不完全确定它需要通过不同的 Flash API 对舞台进行多少访问。我没有取消这种方法,因为它听起来可能是最好的选择,但它可能是一项巨大的努力,我希望对客户端 SWF 产生最小的影响。

我读到的最后一种方法是制作一个 HTML AIR 应用程序。我的理解(充其量是粗略的)是通过 HTML 加载的 SWF(我相信框架/iframe)将有自己的阶段。我的思路是,如果 HTML 应用程序加载一个主页,而该主页又具有一个嵌入了游戏客户端 SWF 的 iframe,那么客户端 SWF 将加载到远程安全沙箱中并可以访问它自己的阶段。我希望 SWF 的行为与在 Flash Player 中一样。

这导致我提出以下问题:

  1. 我对 HTML 应用程序的看法是否正确?
    • 客户端 SWF 是否可以访问其自己的舞台,并且其行为与 Flash Player 中的行为几乎相同?
  2. 可以将基于 HTML 的 AIR 应用程序与强制运行时捆绑在一起吗?
  3. 我可以使用带有 HTMLLoader 的传统 flex 应用程序来实现相同的目标,还是需要一个成熟的 HTML 应用程序?
    • 如果可以使用 HTMLLoader,是否需要在 iframe 标签中提供沙盒脚本桥元标签?

在这一点上,我们将非常感谢任何帮助。似乎有很多选择,但我不确定目前哪条路是正确的。

再次感谢。

乔什

【问题讨论】:

    标签: apache-flex air sandbox


    【解决方案1】:

    你已经调查了很多。我要提到 Loader.loadBytes 技术,但你提到它不安全。实际上,如果您知道可以下载的 SWF 的签名哈希值,您就可以注意安全。我记得在 AIR 团队经理的博客中阅读过这种方法,但我现在不记得链接了。基本上,如果您事先知道所有可以下载的 SWF,然后生成它们的签名散列并将这些散列放入初始 AIR 应用程序附带的 XML 中,则该方法将起作用。然后,初始 AIR 应用程序可以下载这些 SWF,比较它们的签名并将它们加载到应用程序沙箱中,如果它与随附的哈希等匹配。

    【讨论】:

    • 感谢您的回复。我没有考虑过签署 SWF 并在 AIR 应用程序中执行验证。经过一番搜索,我找到了几篇关于这个主题的 Adob​​e 文章。 @Joe 在下面的回复中链接了他的文章,但我会继续在此处发布另一个链接,以供其他人将来参考。 blogs.adobe.com/emalasky/2008/04/remote_plugins.html
    【解决方案2】:

    (很长的问题,有很多点,但这里是)

    1. 您是正确的,通过脚本桥传递舞台对象是行不通的。因此,有必要删除访问阶段的代码并可能使用脚本桥来完成每种特定情况下的工作。
    2. 如果您将 SWF 嵌入到 HTML 页面中,它确实会拥有自己的舞台。无论这是“基于 HTML”的 AIR 应用程序还是使用 HTMLLoader 的基于 ActionScript 的应用程序都没有关系。 (实际上两者是一回事。)您不需要 iframe。这听起来是最简单的方法,尤其是在您不添加许多 AIR 特定功能的情况下。
    3. 有关签名的信息,请参阅http://www.adobe.com/devnet/air/flex/quickstart/articles/xml_signatures.html

    如果您还没有看过的话,我想看看 Steam 为进行此类更新提供了哪些设施。将新项目/更新上传到 Steam 的周转时间真的比将这个安装后更新系统添加到应用程序本身所需的时间更长吗? (我希望您不会处于那种 Dilbertian 情况中,在纸面上,您似乎可以通过做奇怪的事情来节省时间。根据我的经验,在 Microsoft Project(或类似项目)中拖动滑块所创造的奇迹不会'不成功。)

    【讨论】:

    • 感谢您的回复!自从阅读了您的 cmets,我使用 HTMLLoader 深入研究了我的 AIR 应用程序,现在我已经成功加载了客户端,没有安全异常,这是个好消息!一切似乎都正常工作,除了窗口大小调整事件。我的方法是将 HTMLLoader 实例的宽度和高度设置为在调整 NativeWindow 大小时等于舞台的宽度和高度。当我最大化窗口大小时,这似乎工作正常;但是,当我最小化窗口时,游戏似乎保持相同的大小(比例)。有什么想法吗?
    猜你喜欢
    • 2015-08-07
    • 2014-07-16
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 1970-01-01
    相关资源
    最近更新 更多