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 /如何处理它们。
很好的答案。是否有任何时间点定时器和/或JS将被回收/停止。我们遇到了一些问题,即在应用程序进入前台后,定时器在一段时间后不再启动。在将应用程序放在前台时,我会注意到经过很长时间(例如6-12小时)后,JS文件将被重新下载。我希望计时器也能恢复,但事实并非如此。 – Steve 2014-10-03 19:26:45
@Steve我不熟悉这个问题。听起来好像WebKit尝试从缓存中重新载入已释放的资源并以不良的方式进行。我认为框架没有考虑到这种情况。也许这可能是一个更好的解决方案,使用NSTimers并使用'stringByEvaluatingJavaScriptFromString:'触发JS代码。这将引入更有序且可预测的行为。 – 2014-10-03 19:39:33
好的,这基本上就是我们最终做的,并且每次应用程序到达前台时都执行JS来重新启动计时器。谢谢。 – Steve 2014-10-03 19:45:12