[英]Saving flash game state to server after window.onbeforeunload when swf is cross-domain
我的 Facebook 應用程序是一個 Flash 游戲。 我希望游戲 swf 在窗口卸載時將其最新狀態保存到服務器。 因為我用 swfobject 嵌入了 swf,所以我使用它的嵌入處理程序向窗口添加一個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
調用僅在以下情況下失敗:
window.onbeforeunload
處理程序內部調用的 問題是什么? 當游戲來自 CDN 並且保存是由 Javascript 中的onbeforeunload
觸發時,如何不顯眼地保存游戲狀態? 或者有沒有更好的方法來完成同樣的事情?
在 Firefox 中測試。
ExternalInterface 也適用於撥出和撥入呼叫。 但我懷疑這仍然是一個瀏覽器安全問題,因為向內 ExternalInterface 調用僅在以下情況下失敗:
- 它是從 window.onbeforeunload 處理程序內部調用的
- 瑞士法郎起源於亞馬遜。
從它的聲音中你解決了所有的安全問題。
更有可能是您對觸發 onbeforeunload 時幕后發生的事情缺乏了解。
這是一個不會等待您的“game.swf”通過 ExternalInterface 完成回調的函數。這就是您添加延遲機制來延遲該過程的原因。 但是,我將在這里假設這可以從 rails 應用程序運行,因為這是一個本地服務器,並且您不會受到滯后怪物的影響。
現在你可能認為我推遲了它應該工作。 那么延遲是 50 毫秒。 嘗試增加到 5000(5 秒),您應該會看到它開始在 cdn 上工作。
數據的保存應通過 Flash 應用程序控制,而不是由外部來源觸發。
在游戲本身中,您應該有觸發保存事件的里程碑。
最后,我想補充一點,這是迄今為止您可以用來將信息保存到服務器的最糟糕的方法。 onbeforeunload 是不可靠的,並且會受到跨瀏覽器問題的影響,更不用說在 JavaScript 中放置滯后循環只是一個壞主意,最終只會讓您的用戶煩惱到他們不會返回的地步。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.