移动设备上的socket.io - 设备无法断开连接,关闭浏览器,更改标签

时间:2016-03-20 13:15:57

标签: javascript mobile socket.io

我有一个使用NodeJS和Express服务器的基本Socket.io实现。 (基本上是Socket.io网站上的Get Started示例)

在桌面上,它按预期连接/断开连接。当您浏览到套接字连接的页面时。在客户端和服务器端都会触发连接事件。用户关闭浏览器,插座断开连接。

但是在移动设备上,断开连接不能按预期工作。当您浏览到套接字连接的页面时,会触发事件。但是如果用户

,socket.io不会断开连接
  • 关闭浏览器应用程序(Safari或Android浏览器)(按主页按钮)
  • 切换到另一个应用
  • 打开新标签页
  • 使设备进入睡眠状态(按下睡眠按钮)

并且不会在服务器或客户端上触发disconnect事件。

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

当用户离开移动设备上的页面时,是否有任何人知道如何确保Socket.io断开连接。

任何帮助非常感谢。 Doruk

2 个答案:

答案 0 :(得分:1)

经过一番研究后,我找到了一个很好的JS库来检测页面是否仍然可见;如果用户走开;或者即使页面闲置一段时间。

该库是ifvisible.js(https://github.com/serkanyersen/ifvisible.js/

它检测到以下

  • 关闭浏览器应用
  • 切换到浏览器应用中的另一个标签
  • 切换到另一个应用
  • 让设备进入睡眠状态(*)

它们都适用于iOS和Android,但Android上的最后一项除外。在某些较旧的Android设备上,未检测到此事件。我正在使用长空闲超时。

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

答案 1 :(得分:0)

据我所知,移动浏览器上没有“事件”说“嘿,我不再看你”。

您可以尝试执行此操作的一种方法是在您的网页上设置心跳并在事件发生时触发客户端存储。

假设我制作了一个聊天应用程序,我会在每条消息上用我最近的活动时间来更新我的商店。

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

然后我会在服务器或客户端上做一些做某种心跳的事情。

如果你做了服务器让它经常ping你的客户端,看看他们的上一次活动是什么,如果超过10分钟,断开连接。然后你可以打开一个模态,询问“你想重新连接吗?”当他们单击是时,您重新启动套接字。

或者:

您可以将它放在客户端上,并且每隔30秒进行一次间隔检查以查看该存储是否在上次激活时超过10分钟,断开套接字并标记模式消息“您是否愿意重新连接?”。

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