【问题标题】:socket.io on mobile - does not disconnect on device sleep, close browser, change tab移动设备上的 socket.io - 在设备睡眠、关闭浏览器、更改选项卡时不会断开连接
【发布时间】:2016-07-06 23:11:10
【问题描述】:

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

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

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

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

并且断开事件不会在服务器和客户端上触发。

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

有谁知道当用户离开移动页面时如何确保 Socket.io 断开连接。

非常感谢任何帮助。 多鲁克

【问题讨论】:

    标签: javascript mobile socket.io


    【解决方案1】:

    经过一番研究,我发现了一个不错的 JS 库,用于检测页面是否仍然可见;如果用户走开;或者即使页面空闲了一段时间。

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

    它检测到以下内容

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

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

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

    【讨论】:

      【解决方案2】:

      据我所知,在移动浏览器上没有发生任何“事件”来表示“嘿,我不再看你了”。

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

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

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

      然后我会在服务器或客户端上做一些心跳。

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

      或者:

      你可以把它放在客户端上,每隔 30 秒检查一次,看看该商店是否最后一次激活,如果它超过 10 分钟,断开套接字并标记模式消息“你想重新连接?”。

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

      【讨论】:

      • 有两个事件window.onblur和window.onpagehide。但它们在 Android 上的实现并不好。此外,Socket.io 有一个内置的心跳机制,只要连接打开,我每 50 毫秒通过套接字连接发送一次数据。所以我不能使用连接来检测客户端是否空闲。我研究更多:)
      猜你喜欢
      • 1970-01-01
      • 2013-02-16
      • 1970-01-01
      • 2012-05-31
      • 1970-01-01
      • 2011-10-30
      • 2016-10-05
      • 2016-01-06
      • 2010-09-25
      相关资源
      最近更新 更多