1

我的 Facebook 应用程序是一个 Flash 游戏。我希望游戏 swf 在窗口卸载时将其最新状态保存到服务器。由于我使用 swfobject 嵌入了 swf,因此我使用它的 embed 处理程序将onbeforeunload侦听器添加到窗口:

function embedHandler(event)        
{
shell=event.ref;
window.onbeforeunload=function(event)
{
    shell.message("save", null);
        //delay the unloading a bit so flash has time to contact server
    var now = new Date().getTime();
     var later=now+50;
     while (now < later)
     {
        now = new Date().getTime();
      }
     }
 }

这就是问题所在。每次直接从应用程序(rails 应用程序)加载 swf 时,这都会起作用。从亚马逊加载 swf 时,它永远不会工作。

所有跨域问题都在 swf 和应用程序之间解决——rails 应用程序接受来自 Amazon swf 的调用,而 Amazon swf 从 rails 应用程序加载数据。

ExternalInterface也适用于拨出和拨入电话。但我怀疑这仍然是一个浏览器安全问题,因为内向ExternalInterface调用仅在以下情况下失败:

  1. 它是从处理程序内部调用window.onbeforeunload
  2. swf 来自亚马逊。

问题是什么?当游戏来自 CDN 并且保存由onbeforeunloadJavascript 触发时,如何不显眼地保存游戏状态?还是有更好的方法来完成同样的事情?

在 Firefox 中进行测试。

4

1 回答 1

0

ExternalInterface 也适用于呼出和呼入。但我怀疑这仍然是一个浏览器安全问题,因为内向 ExternalInterface 调用仅在以下情况下失败:

  1. 它是从 window.onbeforeunload 处理程序内部调用的
  2. swf 来自亚马逊。

从它的声音你解决了所有的安全问题。
当 onbeforeunload 被触发时,您更有可能对幕后发生的事情缺乏了解。
这是一个不会等待您的“game.swf”通过 ExternalInterface 完成回调的函数。这就是为什么您添加了一个停止机制来延迟该过程的原因。但是,我在这里假设这适用于 rails 应用程序,因为那是本地服务器,您不受延迟怪物的影响。
现在您可能想得很好,我延迟了它应该可以工作。那么延迟是50毫秒。尝试增加到 5000(5 秒),您应该会看到它开始在 cdn 上工作。


数据的保存应通过 Flash 应用程序控制,而不是由外部源触发。
在游戏本身中,您应该具有应该触发保存事件的里程碑。


最后,我确实想补充一点,这是迄今为止您可以用来将信息保存到服务器的最糟糕的方法。onbeforeunload 是不可靠的,并且会受到跨浏览器问题的影响,更不用说在 JavaScript 中放置滞后循环只是一个坏主意,最终只会惹恼您的用户,以至于他们不会返回。

于 2012-11-02T21:37:09.073 回答