首页 > 解决方案 > 当 safari 未聚焦/隐藏时,iPhone 上的 Websocket 连接会丢失

问题描述

我为我的网络应用程序的通知和聊天系统使用单个 websocket 连接。一切正常,除了使用 iPhone 时,在关闭/隐藏 Safari 后(我认为这实际上只是窗口的隐藏/取消焦点)连接丢失,重新打开后不会自动重新连接Safari 窗口。隐藏浏览器窗口时,所有其他智能手机也可能出现这种情况。

在桌面浏览器上这个问题不会发生,因为关闭选项卡/窗口/浏览器将在用户下次访问时重新加载所有内容......但在移动设备上它似乎更像:

我想到的一个解决方案是每 X 分钟运行一个间隔函数来检查是否存在 websocket 连接,否则创建一个......这没关系,但我不太喜欢这种方法,想知道我是否正在做某事到目前为止,我使用 XHR Polling 在 websockets 上出错或丢失。

我将“Rails Action Cable”用于我的网络应用程序的 websocket 连接。因为我使用 Vue.js 作为我的前端,所以我编写了一个自定义包来使用 action cable 的客户端功能而不是 rail 的完全集成(https://www.npmjs.com/package/vue-action-cable),但我认为问题更具体于移动设备上的 websocket 连接,这些连接不聚焦应用程序窗口。

标签: iosiphonemobilewebsocketactioncable

解决方案


在 XHR 轮询应用程序和使用 Action Cable 和 React 的 websocket 应用程序上体验这一点。我为 XHR 轮询所做的解决方案是在服务器返回选项卡时利用document.addEventListener('visibilitychange')并触发对服务器进行 API 调用。document.hidden本质上是“离开”和“返回”触发器。我计划在 React 中使用相同的触发想法,然后确保 Action Cable 连接良好。如果您愿意,我可以在完成后与您分享该解决方案。


推荐阅读