2013-08-01 4 views
2

У меня есть сценарий узла Socket.io с:socket.io XHR-опрос событие разъединение

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

При подключении с Chrome/Safari и закрыть страницу, я вижу "отключиться! в моей консоли сервера.

Однако, когда я подключаюсь к iPhone и закрываю страницу, я не вижу этого сообщения. Я вижу debug - xhr-polling closed due to exceeded duration

Как получить событие разъединения с iOS?

+0

У меня нет iPhone для тестирования, но если бы я был вами, я бы запускал программу захвата пакетов, такую ​​как Wireshark на стороне сервера, и точно видел, как выглядят пакеты в «хороших» и «хороших», плохих "случаях. Вероятно, там будет ключ к тому, как iPhone управляет своей сессией. –

+0

Поддерживает ли ваш iPhone Safari полностью websockets. См. Http://caniuse.com/websockets – user568109

ответ

6

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].

+0

Благодарим вас за предложения. Я нашел параметр «sync disconnect on unload», но это не решило проблему. Tricky. В идеале я бы хотел обработать это с сервера. – arby