2

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

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

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

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

如何使用 iOS 接收断开连接事件?

4

1 回答 1

6

当您在 iPhone 中查看页面时,Socket.io 会切换到 xhr-polling 传输。这可能是由于 socket.io 的配置或您 iPhone 中的浏览器不(完全)支持 websockets 造成的。

socket.io 中的 xhr-polling 实现在连接关闭时不会发出断开连接事件,请参阅github 问题 #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
});

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

更新

根据socket.io force a disconnect over XHR-polling,设置sync disconnect on unload可能不足以解决 iPhone/iPad 上的问题。

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

解决方案可能是修复 socket.io-client 以侦听unloadpagehide事件,因为 卸载事件可能无法按预期进行前后优化。请改用 pageshow 和 pagehide 事件。 [Apple 网页内容指南]

于 2013-08-05T18:13:44.210 回答