【发布时间】:2011-10-18 17:09:42
【问题描述】:
我最近接到了一项任务,将现有的基于 Flash Player 的游戏移植到桌面应用程序中,以便在 Steam 平台上发布。 Adobe AIR 框架似乎是分发的合乎逻辑的选择,尤其是考虑到 AIR 3 的最新更新。鉴于我对 flash/flex 开发相对较新,我已经阅读了大量关于 Adobe 的 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 带入应用程序沙箱。从易于实施的角度来看,我可以看到为什么许多人选择走这条路;但是,我不倾向于采用这种方法,因为如果外部服务器受到威胁,会对用户系统造成潜在危险。
我读到的第二种方法是我可以利用沙盒脚本桥,并编写一个接口来授予外部客户端 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 标签中提供沙盒脚本桥元标签?
在这一点上,我们将非常感谢任何帮助。似乎有很多选择,但我不确定目前哪条路是正确的。
再次感谢。
乔什
【问题讨论】:
标签: apache-flex air sandbox