屏幕解锁后如何在iOS8 Web应用程序上恢复JavaScript计时器?

阿雅耶尔

在iOS8上,如果该Web应用程序处于活动状态并从主屏幕图标启动,则在锁定屏幕然后解锁后,此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
  • 窗口弹跳/平移可能会杀死所有WebWorker。
  • 溢出更改/调整大小事件不再起作用。您需要重新设计依赖于它们的任何逻辑。

制定半解决方案:

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在计时器应用程序上延迟几秒钟?

如何按需运行后台服务-不在应用程序启动或计时器上运行

如何设置应用程序范围的计时器?

如何在Android屏幕解锁后恢复音乐

如何通过Web服务器在您的应用程序上显示最新数据

带计时器的绘图应用程序。绘制不到 20 秒后,计时器开始滞后

如何在 iOS 设备中解锁屏幕后立即激活和打开我的应用程序

如何构建在所有应用程序屏幕中显示的全局计时器

如何在屏幕保护程序后调用Mac授权插件来解锁锁定屏幕?

如何在JavaScript中暂停和恢复计时器?

暂停的iOS应用程序如何使用计时器或获取今天的日期

如何在Swing应用程序中停止计时器

如何在 Blazor 应用程序中使我的计时器泄漏证明?

如何在Android应用程序中设置计时器并对其执行操作

如何在应用程序启动时设置倒数计时器的值

如何在默认的Windows 10计时器应用程序中禁用警报声音

在恢复应用程序上未调用onResume()时,屏幕变黑

如何在iOS11主屏幕Web应用程序上访问相机?

带计时器的arc4random()后,应用程序崩溃了吗?

如何在flutter中将简单的倒计时计时器构造函数实现到应用程序中?

当应用程序进入后台或用户退出应用程序时,如何停止计时器

即使应用程序在后台,如何保持后台计时器在本机运行

如何为测验应用程序创建控制台计时器

如何使用C#在通用Windows应用程序中包含计时器

如何为测验应用程序包括“计时器控件”

如何使用目标c停止和启动应用程序委托计时器?

如何制作即使在后台模式下仍可以运行的计时器应用程序

Android SDK(Eclipse):如何为简单的应用程序创建简单的计时器?

iOS应用程序上的电报