Socket.io переключается на транспорт xhr-опроса, когда вы просматриваете страницу на своем iPhone. Это может быть вызвано конфигурацией socket.io или потому, что браузер на вашем iPhone не поддерживает (полностью) поддержку веб-узлов.
Реализация xhr-polling в socket.io не испускает событие разъединения, когда соединение закрыто, см. github issue #431. Вы можете воспроизвести эту проблему в вашем браузере Chrome, заставляя Socket.io сервера использовать XHR-опрос транспорт только:
// 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-client source code, sync disconnect on unload
устанавливает слушателя для beforeunload
события, которое не поддерживается iOS Safari в соответствии с.
Решение, вероятно, исправить Socket.io-клиент для прослушивания обоих unload
и pagehide
событий, потому что выгрузить событие не может работать, как ожидается, для задней и передней оптимизации. Вместо этого используйте показы страниц и страницы.[Apple Web Content Guide].
У меня нет iPhone для тестирования, но если бы я был вами, я бы запускал программу захвата пакетов, такую как Wireshark на стороне сервера, и точно видел, как выглядят пакеты в «хороших» и «хороших», плохих "случаях. Вероятно, там будет ключ к тому, как iPhone управляет своей сессией. –
Поддерживает ли ваш iPhone Safari полностью websockets. См. Http://caniuse.com/websockets – user568109