2014-10-01 82 views
7

如果加載到UIWebView的頁面包含Javascript setInterval()調用,那麼當手機進入睡眠狀態時,該定時器的行爲是什麼?iOS UIWebView Javascript定時器

是否有任何時間點所有計時器都停止了?

當手機被喚醒時,計時器是否會重新啓動?如果是這樣,計時器是從暫停的地方開始,還是從0開始?

回答

9

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