Actionscript 3 当swf跨域时,在window.onbeforeunload之后将flash游戏状态保存到服务器
我的Facebook应用程序是一款flash游戏。我希望游戏swf在窗口卸载时将其最新状态保存到服务器。由于我将swf与swfobject一起嵌入,因此我使用其嵌入处理程序将onbeforeunload侦听器添加到窗口: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);
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,空;通过点击按钮,让我们看看你从中得到了什么。