2013-11-22 11 views
11

La specifica API recita come segue per il costruttore WebView che permette la navigazione privata per essere abilitato:La navigazione privata è deprecata in Android WebView a partire dall'API 17. Qual è l'alternativa?

(da http://developer.android.com/reference/android/webkit/WebView.html)

WebView (contesto Context, AttributeSet attrs, int defStyle, privateBrowsing booleano)

Questo costruttore è stato dichiarato obsoleto in livello API 17. La navigazione privata non è più supportata direttamente tramite WebView e verrà rimossa in una versione futura. Preferisci l'utilizzo di WebSettings, WebViewDatabase, CookieManager e WebStorage per il controllo accurato dei dati sulla privacy.

A partire da API 19 (KitKat) la navigazione privata è disabilitata. Tentativo di richiamare questo costruttore con un valore di risultati veri in un IllegalArgumentException.

Le alternative suggerite non saranno nemmeno marginalmente efficaci nel replicare il comportamento della navigazione privata. La classe CookieManager è un singleton, con tutte le impostazioni applicate all'intera applicazione. Non esiste un "controllo a grana fine dei dati sulla privacy" con questo approccio. L'unico controllo fornito da CookieManager è la possibilità di disabilitare del tutto i cookie, per OGNI WebView presente nell'app. Questo cambiamento significa che i browser di terze parti non sono più in grado di replicare la funzionalità di navigazione privata del browser di Google in qualsiasi capacità.

Apprezzerei molto qualsiasi suggerimento per aggirare questo comportamento. Fino ad ora non riesco a trovare nulla nell'API che possa rendere possibile qualsiasi somiglianza con la precedente funzionalità di navigazione privata.

+0

"Questo cambiamento significa che i browser di terze parti non sono più in grado di replicare la funzione di navigazione privata del proprio browser di Google a qualsiasi titolo" - al massimo, si limita browser di terze parti che utilizzano 'WebView'. Ci sono opzioni di rendering alternative, come 'GeckoView' di Mozilla. – CommonsWare

+1

Grazie, stavo implicando l'uso di WebView. Sicuramente apprezzare il suggerimento di GeckoView, sarà necessario verificarlo. In questa nota, c'è anche un progetto ChromeView che ha un obiettivo simile con il motore Chrome: https://github.com/pwnall/chromeview Ho letto che questo progetto aggiunge 30 + MiB alle dimensioni dell'APK (non ho personalmente provato comunque). Credo che sia ChromeView che GeckoView siano nelle prime fasi di sviluppo. – tliebeck

risposta

2

In aggiunta a ciò che ho nel commento, questo è un altro posto dove avere più processi è giustificato. Poiché CookieManager è un singleton, i processi separati avranno istanze separate CookieManager. Le istanze "Navigazione privata" WebView potrebbero essere in un processo separato dalle istanze di "regolare consultazione" WebView.

Ciò ha svantaggi:

  • Non possono essere nella stessa attività, come View da un processo non possono essere resi in un altro processo. Quindi, se la metafora dell'interfaccia utente per il browser implica diversi widget WebView in una singola attività (ad es. Schede), tale metafora dell'interfaccia utente dovrà essere ottimizzata per consentire il "cambio di contesto" tra la navigazione normale e privata.

  • Ciò consumerà più RAM di sistema, il che è negativo per l'utente, anche se buono per lo sviluppatore (meno probabilità di OutOfMemoryError eccezioni).

+0

Grazie per il suggerimento ...nel mio caso, non mi dispiacerebbe usare un secondo processo per la navigazione privata, aggiungerebbe addirittura un ulteriore livello di sicurezza. L'implementazione di CookieManager sembra purtroppo causare un problema qui, poiché utilizza un database memorizzato nella directory dei dati interni dell'applicazione in una posizione specifica. Entrambe le istanze di CookieManager tenterebbero di leggere/scrivere dallo stesso database. Non penso sia possibile creare un secondo ID utente in una singola app (ma mi piacerebbe essere sbagliato). – tliebeck

+0

@tliebeck: "poiché utilizza un database memorizzato nella directory dei dati interni dell'applicazione in una posizione specifica" - mentre vero, la chiave è se "setAcceptCookie (false)" supera l'esistenza del database. Si spera che lo farebbe. "Entrambe le istanze di CookieManager tenterebbero di leggere/scrivere dallo stesso database" - in teoria, 'setAcceptCookie (false)' farebbe in modo che il processo non tocchi quel database. E, anche se lo fanno, se il database è SQLite, più processi possono colpire in modo sicuro. – CommonsWare

+0

Grazie, sì, è un database SQLite. Sicuramente non voglio che il processo di navigazione privata sia in grado di accedere ai cookie potenzialmente impostati mentre si è in "normale" modalità di navigazione. Devo comunque accettare i cookie in modalità di navigazione privata (devono sopravvivere solo per la sessione), ma non posso chiamare setAcceptCookie (false). Il CookieSyncManager potrebbe rivelarsi utile qui, ma è un po 'sottile sulla documentazione del suo comportamento. Se il suo metodo stopSync() elimina ogni possibilità di sincronizzazione con quel database, la soluzione potrebbe funzionare. – tliebeck

Problemi correlati