【问题标题】:Socket.io lost connection when phone locks手机锁定时 Socket.io 失去连接
【发布时间】:2015-05-12 13:00:36
【问题描述】:
setInterval(function(){ 
socket.emit("stayalive", { "room": room });
}, 5000);

我有一个简单的浏览器应用程序,它在我的手机上运行了一个间隔函数。我在 Nexus 4 上使用 Chrome 进行调试。我现在的问题是:当我锁定手机时,间隔会在大约 5 分钟后停止,然后我的手机与套接字 io 服务器断开连接。

如果我不锁定屏幕,间隔不会停止,手机也不会断开。

12:29:10 第一个间隔

12:34:27 最后传入间隔

12:35:52 客户端与服务器断开连接

这是一个 android 功能,当手机被锁定时,每个间隔会在 5 分钟后被杀死或类似的东西?

我在我的 nexus 4 上运行 chrome,但使用其他设备的朋友遇到了同样的问题。

【问题讨论】:

  • 您可能想要使用唤醒锁。 More Information
  • @Skynet - OP 有一个浏览器应用程序。是否可以从浏览器访问唤醒锁?
  • 同意 jfriend00,我误会了。

标签: javascript android socket.io


【解决方案1】:

每个移动设备操作系统都对移动设备的电池实施了自己的保护,这包括决定各种东西可以“在后台运行”多长时间。这样做是为了防止手机应用过快耗尽电池电量。

Chrome 的变体都对它们运行间隔的频率有限制(即使是桌面版本的 Chrome 限制不在前台的窗口/选项卡上的间隔计时器),移动变体对 webSockets 等可能需要的东西有进一步的限制定期保持活动数据包以保持连接打开。听起来您已经发现 Chrome 选择手机锁作为限制长时间运行的应用程序并防止它们使用电池的时间。从理论上讲,如果手机被锁定,最终用户可能无法查看应用程序,因此这被认为是一个不错的折衷方案,以节省小型移动电池。

作为一个纯粹的网页应用程序,您无法阻止浏览器像节省电池一样“管理”您的应用程序。如果您有本机应用程序,那么您可以访问针对长时间运行的后台通知进行了更优化的其他操作系统服务(例如推送服务)。


一种可能的解决方法是确定设备/应用何时被唤醒并且用户再次与其交互,然后立即重新连接并获取您在断开连接时可能错过的所有更新。如果您以自动方式执行此操作,则可能根本不会减慢用户的速度。如果您想在手机锁定时获得实际的后台通知,那么您可能必须在手机上使用更多本机应用功能来实现推送服务等功能。

【讨论】:

  • 好的,谢谢,这也是我的想法。我会检查套接字是否已连接,如果没有,我会在用户与页面交互时刷新页面。
  • 您如何确定用户何时再次与页面交互?
  • 我使用了 javascript onscroll 事件,它一直检查用户是否已连接 -> 否则重新连接
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-25
  • 2019-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-25
相关资源
最近更新 更多