在用户离开选项卡或关闭屏幕后,如何检测浏览器何时限制计时器和 websocket 断开连接? (javascript)

2024-02-16

Context

一款作为渐进式网络应用程序发布的游戏,具有计时器(setTimeout, setInterval)和 websocket 连接以获得实时通信。

怎么了

只要用户留在应用程序中,一切都很好。但是,当用户转到另一个选项卡、另一个应用程序或关闭屏幕(如果是移动设备)时,它就变成了“地狱般的未知世界”。

  • Websocket 可能会也可能不会“暂停”或“关闭”
  • 计时器看起来像是受到限制或反跳。

这种行为似乎取决于浏览器和平台,甚至可能取决于特定的用户行为。我猜浏览器和操作系统有自己的生命周期/机制来节省电池和/或计算。

当用户回来时,应用程序处于未知状态,我正在努力正确恢复状态。

关于 websockets 我有自动重新连接套接字.io https://socket.io/ and 重新连接-websocket https://github.com/pladaria/reconnecting-websocket但这还不足以解决所有问题。

寻找答案

  • 不同浏览器的“生命周期”是什么?这有记录吗?他们什么时候决定关闭并节流?
  • 他们对 websocket 到底做了什么?浏览器只是断开它们?
  • 他们对计时器到底做了什么?他们限制它们或使它们反跳还是其他什么?
  • javascript 执行一般会发生什么?暂停/销毁/限制?
  • 当浏览器要关闭某些东西时,有没有办法挂钩某种浏览器生命周期事件?我唯一能找到的可能是可见性API https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API
  • 有没有办法人为地重现这种行为以便能够测试解决方案?在桌面上尤其困难。 Websocket 无法关闭,并且 chromium 开发人员似乎并不急于提供帮助2014 年的一个问题(!):使用连接限制时不包括 websockets https://bugs.chromium.org/p/chromium/issues/detail?id=423246

  • 不管上述情况,是否有一个实用的跨浏览器解决方案来检测/解决这个问题? (例如,根据经验,桌面版 Firefox 的行为似乎与 Chrome 完全不同,iPhone 比 Android 更频繁地断开连接)

相关链接

  • 当页面未处于焦点时,Safari 由于不活动而断开 Web 套接字连接 https://github.com/socketio/socket.io/issues/2924

不太确定,但你可以使用服务人员。据我所知,即使您的选项卡未打开,它们也会在后台运行,如果您的选项卡关闭,它们也会终止。

顺便提一句。每个浏览器上的浏览器选项卡的生命周期似乎都不同,因为每个浏览器处理它的方式都不同。据我所知,如果浏览器需要更多内存来处理其他事情,它可以冻结选项卡。

这是来自的文档Chrome https://developers.google.com/web/updates/2018/07/page-lifecycle-api.

我记得有一些事件(例如 onload)会告诉您用户是否离开或重新打开了选项卡。您可以使用这些事件来重新连接等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在用户离开选项卡或关闭屏幕后,如何检测浏览器何时限制计时器和 websocket 断开连接? (javascript) 的相关文章

随机推荐