ios - 当 safari 未聚焦/隐藏时,iPhone 上的 Websocket 连接会丢失
问题描述
我为我的网络应用程序的通知和聊天系统使用单个 websocket 连接。一切正常,除了使用 iPhone 时,在关闭/隐藏 Safari 后(我认为这实际上只是窗口的隐藏/取消焦点)连接丢失,重新打开后不会自动重新连接Safari 窗口。隐藏浏览器窗口时,所有其他智能手机也可能出现这种情况。
在桌面浏览器上这个问题不会发生,因为关闭选项卡/窗口/浏览器将在用户下次访问时重新加载所有内容......但在移动设备上它似乎更像:
- 失去焦点/隐藏窗口 -> 取消所有客户端/服务器连接
- 再次显示窗口 -> 只显示渲染的 DOM 并调用 Interval/Timeout 函数
我想到的一个解决方案是每 X 分钟运行一个间隔函数来检查是否存在 websocket 连接,否则创建一个......这没关系,但我不太喜欢这种方法,想知道我是否正在做某事到目前为止,我使用 XHR Polling 在 websockets 上出错或丢失。
我将“Rails Action Cable”用于我的网络应用程序的 websocket 连接。因为我使用 Vue.js 作为我的前端,所以我编写了一个自定义包来使用 action cable 的客户端功能而不是 rail 的完全集成(https://www.npmjs.com/package/vue-action-cable),但我认为问题更具体于移动设备上的 websocket 连接,这些连接不聚焦应用程序窗口。
解决方案
在 XHR 轮询应用程序和使用 Action Cable 和 React 的 websocket 应用程序上体验这一点。我为 XHR 轮询所做的解决方案是在服务器返回选项卡时利用document.addEventListener('visibilitychange')
并触发对服务器进行 API 调用。document.hidden
本质上是“离开”和“返回”触发器。我计划在 React 中使用相同的触发想法,然后确保 Action Cable 连接良好。如果您愿意,我可以在完成后与您分享该解决方案。
推荐阅读
- html - 删除缩进并将所有 html 放在一行中
- python - docker中cmp指令的python解释器分段错误
- realm - 领域不会删除对象
- ember.js - 带有新版 ember js 的粘性聊天框
- javascript - Javascript递归向前和向后计数
- reactjs - 使用打字稿和验证重用输入组件
- java - 为什么流程一开始没有进入基类构造函数?
- ios - 如何以编程方式生成一个空的 UIimage 视图
- javascript - 基于点击事件的传单多个弹出窗口
- stripe-payments - Stripe paymentIntent vs Subscription?