当您在 iPhone 中查看页面时,Socket.io 会切换到 xhr-polling 传输。这可能是由于 socket.io 的配置或您 iPhone 中的浏览器不(完全)支持 websockets 造成的。
socket.io 中的 xhr-polling 实现在连接关闭时不会发出断开连接事件,请参阅github 问题 #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源代码中看到的那样,sync disconnect on unload
为事件设置了一个监听器beforeunload
,iOS Safari 不支持该监听器。
解决方案可能是修复 socket.io-client 以侦听unload
和pagehide
事件,因为
卸载事件可能无法按预期进行前后优化。请改用 pageshow 和 pagehide 事件。 [Apple 网页内容指南]。