2014-10-01 21 views
7

Wenn eine Seite geladen in eine UIWebView enthält einen Javascript setInterval() Anruf, was ist das Verhalten dieses Timers, wenn das Telefon geht schlafen?iOS UIWebView Javascript Timer

Gibt es einen Zeitpunkt, zu dem alle Timer gestoppt sind?

Werden die Timer nach dem Aufwachen des Telefons neu gestartet? Wenn ja, beginnt der Timer an der Stelle, an der er angehalten wurde, oder startet er bei 0?

Antwort

9

WebKit interne Timer-Management ist ein wenig seltsam im Allgemeinen und insbesondere in iOS. Sie werden im NSDefaultRunLoopMode-Modus registriert. Wenn beispielsweise auf der Benutzeroberfläche gescrollt wird, werden JavaScript-Ereignisse nicht ausgelöst, aber sie werden auch nicht aggregiert, wie bei normalen Timern (NSTimer).

Um Ihre Frage zu beantworten, werden die Timer beim Aussetzen des Anwendungsprozesses ebenfalls gesperrt, sodass sie nicht ausgelöst werden, solange der Prozess unterbrochen ist. Sobald der Prozess aus welchem ​​Grund auch immer wieder aufgenommen wird (Benutzer öffnete die App, Hintergrund holen, etc.), werden die Timer ihren Lauf fortsetzen und werden zu dem relativen Punkt zurückkehren, wenn der letzte Tick sein sollte.

Wenn Sie also alle 10 Sekunden einen Timer einstellen und die App bei t + 1 Sekunden schließen, dann erneut bei t + 35 Sekunden öffnen, wird der Timer nach 5 Sekunden ausgelöst; Sie würden die Ticks t + 10, t + 20 und t + 30 Sekunden nicht rückwirkend hören.

Hinweis: Dies ist die in-Prozess-Modell basierte Timer-Verwaltung von UIWebView/WebKitLegacy /; Ich bin nicht sehr erfahren mit wie WKWebView/WebKit2/behandelt sie.

+1

Große Antwort. Gibt es einen Zeitpunkt, zu dem die Timer und/oder der JS zurückgefordert/gestoppt werden? Es gibt ein Problem, bei dem die Timer nach einer gewissen Zeit nicht mehr zünden, selbst wenn die App in den Vordergrund gebracht wird. Ich merke nach einer langen Zeit (sagen 6-12 Stunden), wenn die App in den Vordergrund gebracht wird, werden die JS-Dateien erneut heruntergeladen. Ich würde erwarten, dass die Timer auch wieder aufgenommen werden, aber das sind sie nicht. – Steve

+0

@Steve Ich bin mit diesem Problem nicht vertraut. Es klingt, als ob WebKit versucht, freigegebene Ressourcen aus dem Cache neu zu laden, und zwar auf eine schlechte Art und Weise. Ich würde mir vorstellen, dass der Rahmen solche Szenarien nicht berücksichtigt. Vielleicht ist es eine bessere Lösung, NSTimers zu verwenden und den JS-Code mit 'stringByEvaluatingJavaScriptFromString:' auszulösen. Dies würde ein viel geordneteres und vorhersehbareres Verhalten einführen. –

+0

Ok, das ist im Wesentlichen, was wir getan haben, und führen JS aus, um die Timer jedes Mal neu zu starten, wenn die App in den Vordergrund kommt. Vielen Dank. – Steve