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接收断开连接事件?
当您在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']);
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 unload为beforeunload事件设置一个监听器,iOS Safari不支持该监听器.
解决方案可能是修复socket.io-client来监听两者unload和pagehide事件,因为
卸载事件可能无法按预期的方式进行后退和前向优化.请改用pageshow和pagehide事件. [Apple Web内容指南].
| 归档时间: |
|
| 查看次数: |
5506 次 |
| 最近记录: |