我最近的一项任务是将现有的基于 Flash Player 的游戏移植到桌面应用程序以在 Steam 平台上发布。 Adobe AIR 框架似乎是分发的合乎逻辑的选择,尤其是考虑到 AIR 3 的最新更新。鉴于我对 flash/flex 开发相对较新,我已经阅读了大量关于 Adobe 的 AIR 文档站点,以便更好地了解任务涉及的内容。总的来说,我认为我对需要发生的事情有一个不错的想法,但是有一些问题可能会影响是否/如何甚至可以移植到 AIR 框架:
我的首要任务是找出将外部游戏客户端 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 中那样运行。
这导致我提出以下问题:
在这一点上,任何帮助将不胜感激。似乎有很多选择,但我不确定目前哪条道路是正确的选择。
再次感谢。
乔什
最佳答案
你已经调查了很多。我要提到 Loader.loadBytes 技术,但你提到它不安全。实际上,如果您知道可以下载的 SWF 的签名哈希值,您就可以注意安全。我记得在 AIR 团队经理的博客中阅读过这种方法,但我现在不记得链接了。基本上,如果您事先知道所有可以下载的 SWF,然后生成它们的签名散列并将这些散列放入初始 AIR 应用程序附带的 XML 中,则该方法将起作用。然后,初始 AIR 应用程序可以下载这些 SWF,比较它们的签名并将它们加载到应用程序沙箱中(如果它与随附的哈希等匹配)。
关于apache-flex - 将外部 SWF 加载到 Adobe AIR 应用程序 - 最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7811060/