apache-flex - 将外部 SWF 加载到 Adob​​e AIR 应用程序 - 最佳实践?

标签 apache-flex air sandbox

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

  • 由于客户端开发的快速周转时间,AIR 应用程序需要从外部服务器加载实际的游戏客户端。
  • 由于 AIR 应用程序将部署在 Steam 上,我想使用 AIR 3.0 中可用的 Captive Runtime 捆绑,即无需用户“确定”单独的 AIR 安装。
  • 由于我不是游戏的主要开发人员,因此对外部 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 带入应用程序沙箱。从易于实现的角度来看,我可以看到为什么许多人选择走这条路;但是,我不倾向于采用这种方法,因为如果外部服务器受到威胁,会对用户系统造成潜在危险。

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

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

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

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

    再次感谢。

    乔什

    最佳答案

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

    关于apache-flex - 将外部 SWF 加载到 Adob​​e AIR 应用程序 - 最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7811060/

    相关文章:

    apache-flex - 在空气中为 android 旋转 RAW CAMERA(不仅仅是视频)

    flash - AS3 中的实时更新和推送数据

    javascript - 带有 'allow-same-origin' 标志错误的 Iframe 沙盒

    android - 使用 Apache Flex SDK4.8.0、AIR3.4 和 FDT5.6.2 编译生成 "unable to open ' {airHome}/frameworks/libs/air/airglobal.swc'"

    javascript - 切换 iFrame 沙盒

    c# - IronPython 沙盒与 CAS

    apache-flex - 在 Flex 中,如何调整字体大小以使标签与图标对齐?

    actionscript-3 - 在内部组件上调用函数

    java - 保护 Flex-BlazeDS 应用程序的最佳方法是什么?

    java - 使用 Java 将 Flex 与 Blazeds 集成的问题