【发布时间】:2014-11-26 06:59:36
【问题描述】:
如果加载到 UIWebView 的页面包含 Javascript setInterval() 调用,那么当手机进入睡眠状态时,该计时器的行为是什么?
是否存在所有计时器都停止的时间点?
手机唤醒后定时器会重新启动吗?如果是这样,计时器是从暂停的地方开始,还是从 0 开始?
【问题讨论】:
标签: ios iphone ios7 uiwebview ios8
如果加载到 UIWebView 的页面包含 Javascript setInterval() 调用,那么当手机进入睡眠状态时,该计时器的行为是什么?
是否存在所有计时器都停止的时间点?
手机唤醒后定时器会重新启动吗?如果是这样,计时器是从暂停的地方开始,还是从 0 开始?
【问题讨论】:
标签: ios iphone ios7 uiwebview ios8
WebKit 内部计时器管理通常有点特殊,尤其是在 iOS 中。它们在 NSDefaultRunLoopMode 模式下注册,因此,例如,在 UI 中滚动时,Javascript 事件不会触发,但它们也不会聚合,就像使用常规计时器 (NSTimer)。
为了回答您的问题,当应用程序进程暂停时,计时器也会暂停,因此在进程保持暂停时它们不会触发。无论出于何种原因(用户打开应用程序、后台获取等)恢复该进程后,计时器将恢复其运行,并将恢复到应该是最后一次滴答的相对时间点。
所以如果你为每10秒设置一个定时器,并在t+1秒关闭应用程序,然后在t+35秒再次打开,定时器将在5秒后触发;您不会追溯听到 t+10、t+20 和 t+30 秒的滴答声。
注意:这是UIWebView/WebKitLegacy/的基于进程内模型的定时器管理;我对WKWebView /WebKit2/ 如何处理它们不是很有经验。
【讨论】:
stringByEvaluatingJavaScriptFromString: 触发 JS 代码可能是一个更好的解决方案。这将引入一种更加有序和可预测的行为。