在iOS8上,如果该Web应用程序处于 Activity 状态并从主屏幕图标启动,则在锁定屏幕然后解锁后,此HTML5 Web应用程序不会恢复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>

最佳答案

我们最终得到的解决方案并没有解决IOS8中睡眠模式之后所有已损坏的功能,而只是ajax request / setTimeout / setInterval / requestAnimationFrame及其各自的清除功能。
睡眠模式后其他东西坏了:

  • -webkit-transition不透明会导致无法选择的区域
  • 键盘打开时永久调用
  • worker.postMessage会杀死所有WebWorkers
  • 窗口弹跳/平移可以杀死所有WebWorkers。
  • 溢出更改/调整大小事件不再起作用。您需要重新设计依赖于它们的任何逻辑。

  • 制定半解决方案:
  • 覆盖setTimeout / setInterval / requestAnimationFrame / clearInterval / clearTimeout / cancelAnimationFrame。所有这些功能都需要postMessage到Webworker,Webworker将在其中相应地执行setTimeout / setInterval。您可能还需要为这些功能设置暂停机制,但是我并不是100%必需的。
  • 重写XMLHttpRequest,以便在调用send时,该请求实际上是在Webworker上执行的。
  • 为所有Webworker创建一个暂停机制,以便主线程可以确定何时所有Webworker都刷新了他们的消息(基本上需要防止在键盘启动时,在任何工作程序上调用postMessage)。
  • 防止键盘在可编辑元素上弹出。在检测到可编辑元素上的轻击/单击事件后,您需要手动调用焦点功能。
  • 在打开键盘的可编辑元素上覆盖焦点功能。现在,焦点将调用暂停工作程序功能。所有工作人员都暂停之后,调用浏览器的焦点实现。
  • 将focusout事件侦听器添加到可编辑的元素中,以便调用恢复工作程序函数。

  • 我在github上有一个半抽象的版本供其他人使用。我们在相当复杂/大型且高度依赖动画和ajax的应用程序中使用github版本,几乎没有问题。
    https://github.com/TaDaa/IOS8-FIX

    09-16 12:55