環境
タイマー(setTimeout
、setInterval
)とWebSocket接続を備えたプログレッシブWebアプリとして出荷されるゲームは、リアルタイムの通信を取得します。
何が起こっている
ユーザーがアプリにとどまっている限り、すべてが正常です。しかし、ユーザーが別のタブや別のアプリに移動したり、画面をオフにすると(モバイルの場合)、それは「地獄のような未知の世界」になります。
- WebSocketが「一時停止」または「オフ」になる場合とされない場合があります。
- タイマーはスロットルまたはデバウンスされているように見えます。
この動作はブラウザとプラットフォームに依存しているようで、特定のユーザーの動作にも依存しているようです。ブラウザーやOSには、バッテリーや計算を節約するための独自のライフサイクル/メカニズムがあると思います。
ユーザーが戻ったとき、アプリは不明な状態にあり、状態を適切に復元するのに苦労しています。
websocketに関しては、socket.ioとの自動再接続とreconnecting-websocketがありますが、すべてを解決するには十分ではありません。
答えを探しています
- これらに関するさまざまなブラウザの「ライフサイクル」は何ですか?これは文書化されていますか?彼らはいつオフにしてスロットルすることを決めますか?
- 彼らはウェブソケットに対して正確に何をしますか?ブラウザはそれらを切断するだけですか?
- 彼らはタイマーに対して正確に何をしますか?彼らはそれらを抑制したり、それらをデバウンスしたりしますか?
- JavaScriptの実行は一般にどうなりますか?一時停止/破棄/スロットル?
- 何かをオフにするときに、ブラウザのライフサイクルイベントにフックする方法はありますか?私が見つけることができる唯一のものは可視性APIかもしれません
ソリューションをテストできるように、この動作を人工的に再現する方法はありますか?デスクトップでは特に難しいです。WebSocketをオフにすることはできず、Chromium開発者は2014(!)の問題を急いで支援しているようには見えません:接続スロットルを使用する場合、WebSocketは含まれません
上記に関係なく、この問題を検出/解決する実用的なクロスブラウザソリューションはありますか?(たとえば、経験から、デスクトップ上のFirefoxはChromeと比べて動作がまったく異なるようで、iPhoneはAndroidよりはるかに頻繁に切断されます)
関連リンク