socket.io xhr-polling disconnect事件

iRy*_*ell 2 websocket node.js socket.io

我有一个socket.io节点脚本:

socket.on('disconnect', function(data) {    
  console.log('disconnect!');
});
Run Code Online (Sandbox Code Playgroud)

当我连接Chrome/Safari并关闭页面时,我看到"断开连接!" 在我的服务器控制台中

但是,当我连接我的iPhone并关闭页面时,我没有看到此消息.我知道了debug - xhr-polling closed due to exceeded duration

如何通过iOS接收断开连接事件?

Mir*_*toš 6

当您在iPhone中查看页面时,Socket.io会切换到xhr-polling传输.这可能是由socket.io的配置引起的,或者是因为i​​Phone中的浏览器没有(完全)支持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']);
Run Code Online (Sandbox Code Playgroud)

好消息:您可以通过打开sync disconnect on unload标志请求socket.io的客户端通知服务器有关断开连接的信息:

// the browser (HTML) side
var socket = io.connect('http://localhost', {
  'sync disconnect on unload': true
});
Run Code Online (Sandbox Code Playgroud)

警告:当网络和/或服务器速度较慢时,此选项可能会恶化用户体验,请参阅此拉取请求以获取更多信息.

UPDATE

根据socket.io强制断开XHR轮询,设置sync disconnect on unload可能不足以解决iPhone/iPad上的问题.

正如您在socket.io-client 源代码中看到的那样,sync disconnect on unloadbeforeunload事件设置一个监听器,iOS Safari不支持该监听器.

解决方案可能是修复socket.io-client来监听两者unloadpagehide事件,因为 卸载事件可能无法按预期的方式进行后退和前向优化.请改用pageshow和pagehide事件. [Apple Web内容指南].