【发布时间】:2020-06-30 15:28:47
【问题描述】:
上下文
作为渐进式网络应用发布的游戏,具有计时器(setTimeout、setInterval)和 websocket 连接以实现实时通信。
发生了什么
只要用户留在应用程序中,一切都很好。但是当用户转到另一个标签页、另一个应用程序或关闭屏幕(如果是移动设备)时,它就变成了一个“地狱般的未知世界”。
- Websocket 可能会也可能不会“暂停”或“关闭”
- 定时器看起来像是被限制或去抖动。
这种行为似乎取决于浏览器和平台,甚至可能取决于特定的用户行为。我猜浏览器和操作系统有自己的生命周期/机制来节省电池和/或计算。
当用户回来时,应用程序处于未知状态,我正在努力正确恢复状态。
关于 websockets,我使用 socket.io 和 reconnecting-websocket 自动重新连接,但这还不足以解决所有问题。
寻找答案
- 不同浏览器的“生命周期”是什么?这有记录吗?他们什么时候决定关闭和节流?
- 他们究竟对 websocket 做了什么?浏览器只是断开连接?
- 他们究竟对定时器做了什么?它们会限制它们或消除它们的抖动或其他什么?
- javascript 执行一般会发生什么情况?暂停/销毁/限制?
- 当它要关闭某些浏览器生命周期事件时,有没有办法挂钩?我唯一能找到的可能是visibility API
有没有办法人为地重现此行为以测试解决方案?在台式机上尤其困难。 Websockets 无法关闭,chromium 开发者似乎也不急于帮助an issue from 2014(!): websockets not included when using connection throttling
不管上述情况,是否有实用的跨浏览器解决方案来检测/解决此问题? (例如,从经验来看,桌面版 Firefox 的行为似乎与 Chrome 完全不同,iPhone 断开连接的频率远高于 Android)
相关链接
【问题讨论】:
标签: javascript websocket cross-browser progressive-web-apps