【问题标题】:iOS UIWebView Javascript TimersiOS UIWebView Javascript 计时器
【发布时间】:2014-11-26 06:59:36
【问题描述】:

如果加载到 UIWebView 的页面包含 Javascript setInterval() 调用,那么当手机进入睡眠状态时,该计时器的行为是什么?

是否存在所有计时器都停止的时间点?

手机唤醒后定时器会重新启动吗?如果是这样,计时器是从暂停的地方开始,还是从 0 开始?

【问题讨论】:

    标签: ios iphone ios7 uiwebview ios8


    【解决方案1】:

    WebKit 内部计时器管理通常有点特殊,尤其是在 iOS 中。它们在 NSDefaultRunLoopMode 模式下注册,因此,例如,在 UI 中滚动时,Javascript 事件不会触发,但它们也不会聚合,就像使用常规计时器 (NSTimer)。

    为了回答您的问题,当应用程序进程暂停时,计时器也会暂停,因此在进程保持暂停时它们不会触发。无论出于何种原因(用户打开应用程序、后台获取等)恢复该进程后,计时器将恢复其运行,并将恢复到应该是最后一次滴答的相对时间点。

    所以如果你为每10秒设置一个定时器,并在t+1秒关闭应用程序,然后在t+35秒再次打开,定时器将在5秒后触发;您不会追溯听到 t+10、t+20 和 t+30 秒的滴答声。

    注意:这是UIWebView/WebKitLegacy/的基于进程内模型的定时器管理;我对WKWebView /WebKit2/ 如何处理它们不是很有经验。

    【讨论】:

    • 很好的答案。是否有任何时间点可以回收/停止计时器和/或 JS。我们遇到了一个问题,即在一段时间后,即使将应用程序置于前台,计时器也不再触发。我注意到在很长一段时间(比如 6-12 小时)将应用程序置于前台后,JS 文件被重新下载。我希望计时器也能恢复,但事实并非如此。
    • @Steve 我不熟悉这个问题。听起来好像 WebKit 试图从缓存中重新加载释放的资源,但这样做的方式很糟糕。我认为该框架没有考虑到这种情况。也许使用 NSTimers 并使用stringByEvaluatingJavaScriptFromString: 触发 JS 代码可能是一个更好的解决方案。这将引入一种更加有序和可预测的行为。
    • 好的,这就是我们最终要做的事情,并且每次应用程序进入前台时都会执行 JS 来重新启动计时器。谢谢。
    猜你喜欢
    • 2011-09-24
    • 2017-08-06
    • 1970-01-01
    • 2012-07-13
    • 2016-01-06
    • 2014-11-16
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多