我有一个socket.io节点脚本:
socket.on('disconnect', function(data) {
console.log('disconnect!');
});
当我连接Chrome / Safari并关闭页面时,我看到“断开连接!”在我的服务器控制台中。
但是,当我连接iPhone并关闭页面时,我看不到此消息。我看到debug - xhr-polling closed due to exceeded duration
如何通过iOS接收断开事件?
答案 0 :(得分:6)
当您在iPhone中查看页面时,Socket.io会切换到xhr-polling传输。这可能是由socket.io的配置引起的,或者是因为iPhone中的浏览器没有(完全)支持websockets。
当连接关闭时,socket.io中的xhr-polling实现不会发出disconnect事件,请参阅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
});
警告:当网络和/或服务器速度较慢时,此选项可能会恶化用户体验,有关详细信息,请参阅此pull request。
<强>更新强>
根据socket.io force a disconnect over XHR-polling,设置sync disconnect on unload
可能不足以解决iPhone / iPad上的问题。
正如您在socket.io-client source code中看到的那样,sync disconnect on unload
为beforeunload
事件设置了一个监听器,iOS Safari不支持该事件。
解决方案可能是修复socket.io-client来监听unload
和pagehide
事件,因为
卸载事件可能无法按预期进行后退和前向优化。请改用pageshow和pagehide事件。 [Apple Web Content Guide]。