当您在iPhone中查看页面时,Socket.io切换到xhr-polling传输。这可能是由socket.io的配置引起的,或者是因为您的iPhone中的浏览器没有(完全)支持websocket。
当连接关闭时,socket.io中的xhr-polling实现不会发出断开事件,请参见github issue #431。您可以通过强制socket.io服务器只使用XHR轮询运输重现此问题在您的Chrome浏览器:
// the server side
var io = require('socket.io').listen(httpServer);
io.set('transports', ['xhr-polling']);
好消息:你可以问socket.io的客户端转动以通知断开服务器在sync disconnect on unload
标志:
// the browser (HTML) side
var socket = io.connect('http://localhost', {
'sync disconnect on unload': true
});
警告:此选项会恶化,当网络和/或服务器很慢的用户体验,看到这个pull request以获取更多信息。
UPDATE
据socket.io force a disconnect over XHR-polling,设置sync disconnect on unload
可能不足以解决在iPhone/iPad上的问题。
正如你可以在socket.io-客户端source code,sync disconnect on unload
中看到的那样,设置了一个用于beforeunload
事件的侦听器,iOS Safari不支持该侦听器。
的解决方案可能是修复socket.io,客户端侦听这两个unload
和pagehide
事件,因为如预期的前进和后退优化 卸载事件可能无法正常工作。改用pageshow和pagehide事件。[Apple Web Content Guide]。
我没有iPhone来测试,但如果我是你,我会在服务器端运行一个像Wireshark这样的数据包捕获程序,并确切地看到数据包在“好”和“坏“情况。就iPhone如何管理会话而言,可能会有一些线索。 –
你的iPhone Safari是否完全支持websockets。请参阅http://caniuse.com/websockets – user568109