Javascript 手机上的socket.io-在设备睡眠时不断开连接,关闭浏览器,更改选项卡

Javascript 手机上的socket.io-在设备睡眠时不断开连接,关闭浏览器,更改选项卡,javascript,mobile,socket.io,Javascript,Mobile,Socket.io,我有一个基本的Socket.io实现,使用带有Express server的NodeJS。 (基本上是Socket.io网站上的入门示例) 在桌面上,它按预期连接/断开连接。当您浏览到该页面时,套接字将连接。连接事件同时在客户端和服务器端激发。当用户关闭浏览器时,套接字断开连接 但在移动设备上,这种断开连接并没有像预期的那样起作用。当您浏览到该页面时,套接字将连接,并触发事件。但是,如果用户 关闭浏览器应用程序(Safari或Android浏览器)(按home按钮) 切换到其他应用程序 打开一

我有一个基本的Socket.io实现,使用带有Express server的NodeJS。 (基本上是Socket.io网站上的入门示例)

在桌面上,它按预期连接/断开连接。当您浏览到该页面时,套接字将连接。连接事件同时在客户端和服务器端激发。当用户关闭浏览器时,套接字断开连接

但在移动设备上,这种断开连接并没有像预期的那样起作用。当您浏览到该页面时,套接字将连接,并触发事件。但是,如果用户

  • 关闭浏览器应用程序(Safari或Android浏览器)(按home按钮)
  • 切换到其他应用程序
  • 打开一个新选项卡
  • 使设备进入睡眠状态(按下睡眠按钮)
断开连接事件不会在服务器或客户端上触发

我尝试使用window.pagehide通过JavaScript检测这些事件,但它也不能正常启动

有人知道当用户离开手机页面时,如何确保Socket.io断开连接吗

非常感谢您的帮助。
Doruk

据我所知,手机浏览器上没有出现“嘿,我不再看你了”这样的“事件”

不过,您可以尝试这样做的一种方法是在网页上有一个心跳信号,并在事件发生时触发客户端存储

比如说,我制作了一个聊天应用程序,我会在每条信息上用我最新的活动时间更新我的商店

或者一个网页,对于被点击的路线,我会更新我的商店以节省该活动的时间

然后我会在服务器或客户机上有一些做了某种心跳的东西

如果服务器让它以您想要的频率ping客户机并查看他们的最后一个活动是什么,如果时间超过10分钟,请断开连接。然后,您可以打开一个模式,询问类似“是否要重新连接?”的问题,当他们单击“是”时,您将重新启动套接字

或:

您可以将其放在客户机上,每30秒进行一次间隔检查,查看该存储是否已最后激活。如果时间超过10分钟,请断开套接字并标记模式消息“是否要重新连接?”


您还可以在新页面加载或输入消息时触发重新连接事件,并完全跳过模式以使其更加无缝。

经过一些研究,我发现了一个不错的JS库,可以检测页面是否仍然可见;如果用户走开;或者,即使页面在一定时间内处于空闲状态

该库是ifvisible.js()

它检测到以下情况:

  • 关闭浏览器应用程序
  • 切换到浏览器应用程序中的其他选项卡
  • 切换到其他应用程序
  • 将设备置于睡眠状态(*)
它们都可以在iOS和Android上工作,但Android上的最后一项除外。在一些较旧的Android设备上,未检测到此事件。我使用的是长空闲超时


因此,在这些事件的帮助下,我手动断开了套接字。

有两个事件window.onblur和window.onpagehide。但它们在Android上的实现并不好。另外,Socket.io有一个bult-in-heartbeat机制,只要连接打开,我就会每隔50毫秒通过Socket连接发送数据。因此,我无法使用连接来检测客户端是否空闲。我研究更多:)