2013-08-01 42 views
2

我有一个socket.io节点脚本:socket.io XHR轮询断开事件

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

当我使用Chrome/Safari浏览器连接并关闭网页,我看到“断!”在我的服务器控制台。

但是,当我连接我的iPhone并关闭页面时,我看不到此消息。我看到debug - xhr-polling closed due to exceeded duration

如何在iOS上收到断开事件?

+0

我没有iPhone来测试,但如果我是你,我会在服务器端运行一个像Wireshark这样的数据包捕获程序,并确切地看到数据包在“好”和“坏“情况。就iPhone如何管理会话而言,可能会有一些线索。 –

+0

你的iPhone Safari是否完全支持websockets。请参阅http://caniuse.com/websockets – user568109

回答

6

当您在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,客户端侦听这两个unloadpagehide事件,因为如预期的前进和后退优化 卸载事件可能无法正常工作。改用pageshow和pagehide事件。[Apple Web Content Guide]

+0

感谢您的建议。我发现'卸载时同步断开连接'选项,但它并没有解决问题。棘手。理想情况下,我想从服务器端处理这个问题。 – arby