让 WebSocket 在 Mobile Safari 中保持活跃

Posted

技术标签:

【中文标题】让 WebSocket 在 Mobile Safari 中保持活跃【英文标题】:Keep WebSocket alive in Mobile Safari 【发布时间】:2014-07-17 06:13:57 【问题描述】:

一旦屏幕被锁定,是否可以在 Mobile-Safari 中保持 html 5 网页 WebSocket 连接打开?

我想全天不断地向我的用户发送更新,而他们的屏幕总是必须解锁才能接收这些通知,这似乎很愚蠢。

还有其他选择吗?

【问题讨论】:

你使用的是什么服务器端架构? @Pinal:请不要添加内联代码跨度 (like this) 来强调。请参阅this Meta post 了解更多信息。 @khagesh:我不确定服务器架构是否重要?我正在使用带有 rails-websocket gem 的 rails 4。 【参考方案1】:

我认为在浏览器处于后台或屏幕锁定时保持连接打开是不可能的,原因是应用程序基本上被冻结在内存中。这是a similar question的引述:

您不能保持网络套接字打开的原因是,如果您的应用程序在收到连接时没有跳转到前台,它就无法响应网络流量(因为如果它不在前台,它的内存内容将被冻结)。

但是,我确实在 Push Notifications for Websites 上找到了这个页面,它向您展示了“即使您的网站未在 Safari 中运行,如何注册您的用户以接收通知”。

还有其他一些选择:如果您想发送持续更新,您可以编写一个应用程序,然后按照 Apple 网站上的说明发送至 keep a socket open permanently,或者您可以配置应用程序以实现 Push Notifications。

很抱歉,我找不到快速解决方法,但我希望这些选项中至少有一个适合您!

【讨论】:

感谢 Eoin。我强烈怀疑你是对的,不能在移动 safari 中保持套接字打开。我确实看到了一些让 javascript 在 safari 背景页面中运行的技巧——这可能会提供一个解决方案,但我还没有尝试过。我最后的办法是不使用 Safari 并切换到我希望避免的原生包装器,例如 Cordova。 这个答案是正确的。没有办法因为标签/页面像VM一样运行,一旦有最小化认为VM被挂起,没有任何东西可以与它们交互,女巫是正确的,当你不在页面上时,网站不应该运行东西. 谢谢马丁。让具有焦点的“VM”暂停本身只是因为屏幕空白似乎是一座通往遥远的桥梁,特别是如果设备(1)有电并且(2)在wifi上。如果他们允许开发人员选择在屏幕空白时不暂停 VM 似乎会更好。【参考方案2】:

我找到了一种让 WebSocket 在 Mobile Safari 中保持活力的方法。

基本上它与this question的解决方案相同。

创建一个无限循环的音频文件以保持 Javascript 运行:

<audio loop src="http://www.sousound.com/music/healing/healing_01.mp3"></audio>

注意:启动音频文件需要一些用户交互。

如果 WebSocket 以与音频或视频文件相同的方式使浏览器保持活动状态,那就太好了。

PS 这也适用于 android

【讨论】:

我觉得不公平!想象一下很多网站都包含 WS 并将其保留在后台的情况。这会在未经用户同意的情况下耗尽电池电量。这是我在安卓的Lightning浏览器中看到的,手机锁定后还能保持连接,唉! @k3a 我发现不公平的是,原生应用程序可以保持其线程处于活动状态,而 Web 应用程序不能 - 特别是在使用 ws 时,重点是实时更新!更好的解决方案是让 Android 要求用户允许这种情况发生。 这个no longer works移动游猎

以上是关于让 WebSocket 在 Mobile Safari 中保持活跃的主要内容,如果未能解决你的问题,请参考以下文章

用于 Windows CE/Mobile 的 C++ 中的 HTTP Websockets 客户端库

在显示 jQuery Mobile 页面之前让 Google 地图正确加载

如何让 WebSocket 服务器在 aws 上运行

如何让jquery mobile listview(或类似的)具有多列

如何让 jQuery mobile 使用应用程序脚本?

如何让 Windows Mobile 设备中心连接到模拟器