如何在屏幕解锁后恢复iOS8网络应用上的JavaScript计时器?

aja*_*yel 14 javascript html5 ios8

在iOS8上,这个HTML5网络应用程序在屏幕被锁定后不会恢复js计时器,然后在webapp处于活动状态并从主屏幕图标启动时解锁.在iOS7上,计时器将在这种情况下继续.我需要计时器在屏幕解锁后继续 - 任何提示来实现这一目标?

注意/请首先使用Safari的"添加到主屏幕"通过共享按钮将Web应用程序添加到主屏幕.在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>
Run Code Online (Sandbox Code Playgroud)

TaD*_*Daa 5

我们最终解决的解决方案并未解决IOS8中睡眠模式后的所有损坏功能,而只是ajax requests/setTimeout/setInterval/requestAnimationFrame及其各自的清除功能.

睡眠模式后破坏的其他事情:

  • -webkit-transition opacity导致不可选区域
  • 键盘打开时调用的worker.postMessage会永久杀死所有WebWorkers
  • 窗口弹跳/平移可以杀死所有WebWorkers.
  • overflowchange/resize事件不再起作用.你需要重做任何依赖于它们的逻辑.

制作半工作解决方案:

  1. 覆盖setTimeout/setInterval/requestAnimationFrame/clearInterval/clearTimeout/cancelAnimationFrame.所有这些函数都需要postMessage到webworker,webworker将相应地执行setTimeout/setInterval.您可能还需要为这些功能设置暂停机制,但我不是100%必需的.
  2. 覆盖XMLHttpRequest,以便在调用send时,实际上是在webworker上执行请求.
  3. 为所有Web工作者创建一个暂停机制,以便主线程可以确定所有Web工作者何时刷新了他们的消息(基本上需要防止在键盘启动时调用任何工作人员调用postMessage).
  4. 防止键盘弹出可编辑元素.在可编辑元素上检测到点击/单击事件后,您需要手动调用焦点功能.
  5. 在打开键盘的可编辑元素上覆盖焦点功能.焦点现在将调用暂停工作器功能.暂停所有工作程序后,调用浏览器实现焦点.
  6. 将focusout事件侦听器添加到可编辑元素,以便调用resume workers函数.

我在我的github上有一个半抽象版本可供其他人使用.我们在相当复杂/大型和大量动画+ ajax相关的应用程序中使用github版本,几乎没有问题.

https://github.com/TaDaa/IOS8-FIX