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.
fonte
2014-10-03 18:19:24
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
@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. –
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