1

私のFacebookアプリはフラッシュゲームです。ウィンドウがアンロードされたときに、ゲームの 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();
      }
     }
 }

これが問題です。これは、swf がアプリ (Rails アプリ) から直接読み込まれるたびに機能します。swf が Amazon からロードされている場合は機能しません。

クロスドメインの問題はすべて、swf とアプリの間で解決されます。レール アプリは Amazon swf からの呼び出しを受け入れ、Amazon swf はレール アプリからデータをロードします。

ExternalInterfaceまた、発信通話と着信通話の両方で機能します。しかし、これはブラウザのセキュリティ上の問題であると思わExternalInterfaceれます.

  1. window.onbeforeunloadハンドラー内から呼び出されます
  2. swf は Amazon から発信されています。

何が問題ですか?onbeforeunloadゲームが CDN からのものであり、保存がJavascriptによってトリガーされた場合、ゲームの状態を目立たないように保存するにはどうすればよいですか? または、これと同じことを達成するためのより良い方法はありますか?

Firefox でのテスト。

4

1 に答える 1

0

また、ExternalInterface は、発信通話と着信通話の両方で機能します。しかし、内向きの ExternalInterface 呼び出しは次の場合にのみ失敗するため、これはブラウザーのセキュリティ上の問題であると思われます。

  1. window.onbeforeunload ハンドラ内から呼び出されます
  2. swf は Amazon から発信されています。

その音から、あなたはすべてのセキュリティ問題を解決しました。
onbeforeunload がトリガーされたときに舞台裏で何が起こっているかについて、あなたが理解していない可能性が高いです。
これは、「game.swf」が ExternalInterface を介してコールバックを終了するのを待たない関数です。これが、そのプロセスを遅らせるための停止メカニズムを追加した理由です。ただし、これは Rails アプリから機能すると仮定します。これはローカル サーバーであり、ラグ モンスターの影響を受けないためです。
今、あなたはよく考えているかもしれませんが、私はそれがうまくいくはずです。その遅延は 50 ミリ秒です。5000 (5 秒) まで増やしてみると、cdn で動作するようになるはずです。


データの保存は、フラッシュ アプリを介して制御する必要があり、外部ソースによってトリガーされないようにする必要があります。
ゲーム自体には、保存イベントをトリガーするマイルストーンが必要です。


最後に、サーバーに情報を保存するために使用できる最悪の方法であることを付け加えておきます。onbeforeunload は信頼性が低く、クロス ブラウザーの問題が発生する可能性があります。JavaScript にラグ ループを配置することはおろか、単に悪い考えであり、最終的には、ユーザーが戻ってこないという点でユーザーを苛立たせるだけです。

于 2012-11-02T21:37:09.073 に答える