iOS UIWebView Javascript定时器

问题描述:

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

是否有任何时间点所有计时器都停止了?

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

WebKit内部定时器管理一般来说有点奇怪,特别是在iOS中。它们以NSDefaultRunLoopMode模式注册,因此,例如,在UI中滚动时,JavaScript事件不会触发,但它们也不会聚合,就像常规计时器(NSTimer)一样。

要回答你的问题,当应用程序进程被挂起时,定时器也被挂起,所以在进程保持挂起时它们不会被触发。一旦无论什么原因(用户打开应用程序,后台提取等)恢复该过程,计时器将恢复运行,并且将恢复到最后一次应答的相对时间点。因此,如果您每10秒钟设置一个计时器,并在t + 1秒关闭应用程序,然后在t + 35秒再次打开它,计时器将在5秒钟后启动;你将不会追溯到t + 10,t + 20和t + 30秒钟时刻。

注意:这是基于进程内模型的计时器管理UIWebView/WebKitLegacy /;我不太了解WKWebView/WebKit2 /如何处理它们。

+1

很好的答案。是否有任何时间点定时器和/或JS将被回收/停止。我们遇到了一些问题,即在应用程序进入前台后,定时器在一段时间后不再启动。在将应用程序放在前台时,我会注意到经过很长时间(例如6-12小时)后,JS文件将被重新下载。我希望计时器也能恢复,但事实并非如此。 – Steve 2014-10-03 19:26:45

+0

@Steve我不熟悉这个问题。听起来好像WebKit尝试从缓存中重新载入已释放的资源并以不良的方式进行。我认为框架没有考虑到这种情况。也许这可能是一个更好的解决方案,使用NSTimers并使用'stringByEvaluatingJavaScriptFromString:'触发JS代码。这将引入更有序且可预测的行为。 – 2014-10-03 19:39:33

+0

好的,这基本上就是我们最终做的,并且每次应用程序到达前台时都执行JS来重新启动计时器。谢谢。 – Steve 2014-10-03 19:45:12