2014-10-01 12 views
7

Se una pagina caricata in un UIWebView contiene una chiamata Javascript setInterval(), qual è il comportamento di tale timer quando il telefono va in stop?iOS UIWebView Timer Javascript

C'è un momento nel tempo in cui tutti i timer sono fermi?

I timer verranno riavviati quando il telefono viene riattivato? In tal caso, il timer inizia da dove è stato messo in pausa o è partito da 0?

risposta

9

La gestione interna del timer WebKit è un po 'particolare in generale, e in particolare in iOS. Sono registrati in modalità NSDefaultRunLoopMode, quindi ad esempio, quando si scorre nella UI, gli eventi Javascript non si attivano, ma non sono aggregati, come con i timer regolari (NSTimer).

Per rispondere alla tua domanda, quando il processo di richiesta è sospeso, anche i timer sono sospesi, in modo che non si attivino mentre il processo rimane sospeso. Una volta che il processo è stato ripreso per qualsiasi motivo (l'utente ha aperto l'app, il recupero in background, ecc.), I timer riprenderanno la loro corsa e riprenderanno al punto relativo di quando si supponeva che l'ultima tacca fosse.

Quindi, se si imposta un timer ogni 10 secondi e si chiude l'app t + 1 secondi, quindi si riapre nuovamente a t + 35 secondi, il timer si attiva dopo 5 secondi; non sentirai in modo retroattivo i t di t + 10, t + 20 e t + 30 secondi.

Nota: Questo è il modello di gestione del timer in-process a base di UIWebView/WebKitLegacy /; Non sono abbastanza esperto di come WKWebView/WebKit2/li gestisce.

+1

Ottima risposta. C'è un momento in cui i timer e/o il JS dovrebbero essere recuperati/fermati. Stiamo riscontrando un problema in cui dopo un certo periodo di tempo i timer non si attivano più anche quando l'app viene portata in primo piano. Ho notato che dopo un lungo periodo di tempo (diciamo 6-12 ore) quando si porta l'app in primo piano, i file JS vengono nuovamente scaricati. Mi aspetto che i timer riprendano, ma non lo sono. – Steve

+0

@Steve Non ho familiarità con questo problema. Sembra che WebKit tenti di ricaricare le risorse liberate dalla cache e lo faccia in modo negativo. Vorrei dire che il framework non sta prendendo in considerazione tali scenari. Forse potrebbe essere una soluzione migliore per usare NSTimers e attivare il codice JS usando 'stringByEvaluatingJavaScriptFromString:'. Ciò introdurrebbe un comportamento molto più ordinato e prevedibile. –

+0

Ok, questo è essenzialmente ciò che abbiamo finito e stiamo eseguendo JS per riavviare i timer ogni volta che l'app arriva in primo piano. Grazie. – Steve