【发布时间】:2014-11-18 10:32:18
【问题描述】:
在 iOS8 上,此 HTML5 网络应用程序不会在屏幕锁定后恢复 js 计时器,如果网络应用程序处于活动状态并从主屏幕图标启动,则该应用程序会解锁。在 iOS7 上,计时器将在这种情况下继续。我需要在屏幕解锁后继续计时 - 有什么提示可以实现吗?
注意/请先使用 Safari 的“添加到主屏幕”通过共享按钮将网络应用程序添加到主屏幕。在 Safari 中运行页面不会导致上述问题。
<html>
<head>
<meta name="apple-mobile-web-app-capable" content="yes" />
<title>Test</title>
<script>
var tim;
function go() {
tim = window.setInterval(action, 1000);
}
function action() {
document.getElementById('x').innerHTML = new Date().getTime().toString();
}
</script>
</head>
<body onload="go()">
<div id="x"></div>
</body>
</html>
【问题讨论】:
-
屏幕解锁后似乎所有的 setTimeout 和 setInterval 都失败了
-
比较 web worker 定时器和本地定时器来检测本地定时器是否停止。然后我们可以 document.write('please restart') 因为发出 window.location.reload() 不能修复计时器问题
-
在此之后 websocket 连接也完全断开。
-
我也遇到过类似的问题,但似乎影响更深远。例如,我有一个通常保存到主屏幕的网络应用程序。由于在一些测试设备上安装了 iOS 8,如果设备被锁定然后再次解锁,尽管我的 web 应用程序仍然处于打开状态并全屏,所有后续的 AJAX 请求都没有收到响应。通过检查 Apache 的 Web 日志,我可以看到后端服务器接收到请求并发送有效响应,但没有执行成功、失败和完成事件。
-
Apple 再次让事情变得困难! 您可以监控屏幕上任意位置的点击或任何可能从用户交互中触发的事件,以检查计时器是否正在运行。如果不是,则重新启动计时器、AJAX 连接、WebSockets 等。
标签: javascript html ios8