Actionscript 3 当swf跨域时,在window.onbeforeunload之后将flash游戏状态保存到服务器

Actionscript 3 当swf跨域时,在window.onbeforeunload之后将flash游戏状态保存到服务器,actionscript-3,flash,cross-domain,dom-events,externalinterface,Actionscript 3,Flash,Cross Domain,Dom Events,Externalinterface,我的Facebook应用程序是一款flash游戏。我希望游戏swf在窗口卸载时将其最新状态保存到服务器。由于我将swf与swfobject一起嵌入,因此我使用其嵌入处理程序将onbeforeunload侦听器添加到窗口: function embedHandler(event) { shell=event.ref; window.onbeforeunload=function(event) { shell.message("save", null);

我的Facebook应用程序是一款flash游戏。我希望游戏swf在窗口卸载时将其最新状态保存到服务器。由于我将swf与swfobject一起嵌入,因此我使用其嵌入处理程序将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();
      }
     }
 }
问题出在这里。每次直接从app a rails app加载swf时,这种方法都有效。当swf从Amazon加载时,它永远不会工作

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

ExternalInterface也适用于传出和传入呼叫。但我怀疑这仍然是一个浏览器安全问题,因为向内的外部接口调用只有在以下情况下才会失败:

它是从window.onbeforeunload处理程序内部调用的 swf起源于亚马逊。 有什么问题?当游戏来自CDN且保存由Javascript中的onbeforeunload触发时,如何悄悄地保存游戏状态?还是有更好的方法来完成同样的事情

在Firefox中测试

ExternalInterface也适用于传出和传入呼叫。但是 我怀疑这是一个浏览器安全问题,因为 只有在以下情况下,内向外部接口调用才会失败:

它是从window.onbeforeunload处理程序内部调用的 swf起源于亚马逊。 听上去你解决了所有的安全问题。 更可能是您对触发onbeforeunload时幕后发生的事情缺乏了解。 这是一个不会等待game.swf通过ExternalInterface完成回调的函数。这就是为什么您添加了暂停机制来延迟该过程。然而,我将在这里假设这在rails应用程序中起作用,因为这是一个本地服务器,您不受滞后怪物的影响。 现在你可能会想,我推迟了,它应该会起作用。这个延迟是50毫秒。尝试增加到50005秒,您应该会看到它开始在cdn上工作

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


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

我对节省时间以及达到里程碑级别、支付金钱等方面的节省进行了计时。。我只是想介绍一下有人关闭浏览器选项卡以关闭或意外关闭,并且定时保存被切断的情况。但我同意你的观点。它既丑陋又不可靠。现在它是学术性的,但我发现与你想象的正好相反:当我在本地测试并从CDN引入SWF时,它不起作用,而它在生产环境中起作用,我的rails应用程序在heroku中。更改等待时间没有效果,因为这是swf卸载速度的问题,而不是加载速度的问题。所以问题的根源可能是一个不明的安全问题。它可以在生产中使用…但我还是会把它扔掉。试着安装HTTPFox for FireFox,看看数据是否被发送。数据不是从flash发送的。事实上,嵌入的CDN闪存在处理程序中是无法访问的,没有错误,但是js->swf调用也不起作用。奇怪的是,在onbeforeunload处理程序之外,没有问题。好的,如果有问题,那么您就看不到它,因为页面正在关闭。完全删除onbeforeunload函数。然后创建一个新函数,其中包含相同的代码,但将从html页面上的按钮调用该函数。基本触发shell.messagesave,空;通过点击按钮,让我们看看你从中得到了什么。