2

次のような socket.io ノード スクリプトがあります。

socket.on('disconnect', function(data) {    
  console.log('disconnect!');
});

Chrome / Safari で接続してページを閉じると、「切断されました!」と表示されます。私のサーバーコンソールで。

しかし、iPhone に接続してページを閉じると、このメッセージは表示されません。そうですかdebug - xhr-polling closed due to exceeded duration

iOS で切断イベントを受け取るにはどうすればよいですか?

4

1 に答える 1

6

iPhone でページを表示している場合、Socket.io は xhr-polling トランスポートに切り替えます。これは、socket.io の構成が原因であるか、iPhone のブラウザーが Websocket を (完全に) サポートしていないことが原因である可能性があります。

socket.io の xhr-polling 実装は、接続が閉じられたときに切断イベントを発行しません。github issue #431を参照してください。socket.io サーバーが xhr-polling トランスポートのみを使用するように強制することで、Chrome ブラウザーでこの問題を再現できます。

// the server side
var io = require('socket.io').listen(httpServer);
io.set('transports', ['xhr-polling']);

朗報:sync disconnect on unloadフラグをオンにすることで、socket.io のクライアントに切断についてサーバーに通知するように依頼できます。

// the browser (HTML) side
var socket = io.connect('http://localhost', {
  'sync disconnect on unload': true
});

警告: このオプションは、ネットワークやサーバーが遅い場合にユーザー エクスペリエンスを悪化させる可能性があります。詳細については、このプル リクエストを参照してください。

アップデート

socket.io force a disconnect over XHR-pollingによると、設定sync disconnect on unloadだけでは iPhone/iPad の問題を解決できない可能性があります。

socket.io-client source codeでわかるように、iOS Safari ではサポートされていないイベントsync disconnect on unloadのリスナーを設定します。beforeunload

解決策はおそらく、socket.io-client を修正してunloadpagehideイベント の両方をリッスンすることです。代わりに、pageshow および pagehide イベントを使用してください。 [Apple Web コンテンツ ガイド] .

于 2013-08-05T18:13:44.210 に答える