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 を修正してunload
とpagehide
イベント
の両方をリッスンすることです。代わりに、pageshow および pagehide イベントを使用してください。 [Apple Web コンテンツ ガイド] .