将外部SWF加载到Adobe AIR应用程序中 - 最佳实践?

时间:2011-10-18 17:09:43

标签: flex air sandbox

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

  1. 由于客户端开发的快速周转时间,AIR应用程序需要从外部服务器加载实际的游戏客户端。
  2. 由于AIR应用程序将部署在Steam上,因此我想使用AIR 3.0中提供的Captive Runtime捆绑,即用户无需“确定”单独的AIR安装。
  3. 对外部SWF中的代码更改影响最小,因为我不是游戏的主要开发人员。
  4. 我的首要任务是找出将外部游戏客户端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. 我可以将传统的Flex应用程序与HTMLLoader一起使用来实现相同的目标,还是需要成为一个成熟的HTML应用程序?
      • 如果可以使用HTMLLoader,我是否需要在iframe代码中提供沙箱脚本桥元标记?
    4. 目前非常感谢任何帮助。似乎有很多选择,但我不确定在这个时间点追求哪条路是正确的。

      再次感谢。

      约什

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

  1. 你是正确的,通过脚本桥传递Stage对象是行不通的。因此,删除访问阶段的代码并可能使用脚本桥来完成每个特定情况下的工作是必要的。
  2. 如果您将SWF嵌入HTML页面,它确实会有自己的阶段。无论这是“基于HTML”的AIR应用程序还是使用HTMLLoader的基于ActionScript的应用程序,都无关紧要。 (实际上两者是相同的。)你不需要iframe。这听起来像是最简单的方法,特别是如果您没有添加许多特定于AIR的功能。
  3. 有关签名的信息,请参阅http://www.adobe.com/devnet/air/flex/quickstart/articles/xml_signatures.html
  4. 我要看的另一件事,如果你还没有,那么Steam提供的设施是进行此类更新。上传新项目/更新到Steam的周转时间是否真的大于将此安装后更新系统添加到应用程序本身所需的时间? (我希望你不是在Dilbertian的一种情况下,在纸面上看起来你可以通过做奇怪的事情来节省时间。根据我的经验,通过在Microsoft Project(或类似)中拖动滑块创建的奇迹不是'平移。)