簡體   English   中英

當swf跨域時,在window.onbeforeunload之后將Flash游戲狀態保存到服務器

[英]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調用僅在以下情況下失敗:

  1. 它是從window.onbeforeunload處理程序內部調用的
  2. 瑞士法郎起源於亞馬遜。

問題是什么? 當游戲來自 CDN 並且保存是由 Javascript 中的onbeforeunload觸發時,如何不顯眼地保存游戲狀態? 或者有沒有更好的方法來完成同樣的事情?

在 Firefox 中測試。

ExternalInterface 也適用於撥出和撥入呼叫。 但我懷疑這仍然是一個瀏覽器安全問題,因為向內 ExternalInterface 調用僅在以下情況下失敗:

  1. 它是從 window.onbeforeunload 處理程序內部調用的
  2. 瑞士法郎起源於亞馬遜。

從它的聲音中你解決了所有的安全問題。
更有可能是您對觸發 onbeforeunload 時幕后發生的事情缺乏了解。
這是一個不會等待您的“game.swf”通過 ExternalInterface 完成回調的函數。這就是您添加延遲機制來延遲該過程的原因。 但是,我將在這里假設這可以從 rails 應用程序運行,因為這是一個本地服務器,並且您不會受到滯后怪物的影響。
現在你可能認為我推遲了它應該工作。 那么延遲是 50 毫秒。 嘗試增加到 5000(5 秒),您應該會看到它開始在 cdn 上工作。


數據的保存應通過 Flash 應用程序控制,而不是由外部來源觸發。
在游戲本身中,您應該有觸發保存事件的里程碑。


最后,我想補充一點,這是迄今為止您可以用來將信息保存到服務器的最糟糕的方法。 onbeforeunload 是不可靠的,並且會受到跨瀏覽器問題的影響,更不用說在 JavaScript 中放置滯后循環只是一個壞主意,最終只會讓您的用戶煩惱到他們不會返回的地步。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM