2013-11-22 19 views
11

Specyfikacja API brzmi dla konstruktora WebView, który umożliwia przeglądanie prywatne zostać włączona:Prywatne przeglądanie jest przestarzałe w Androidzie WebView od wersji 17. Co to jest alternatywa?

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

WebView (kontekstowego Context, AttributeSet attrs, int defStyle, logiczna privateBrowsing)

Ten konstruktor została zaniechana na poziomie API 17. prywatne przeglądanie nie jest już obsługiwana bezpośrednio przez WebView i zostanie usunięta w przyszłych wydaniach. Preferuj korzystanie z WebSettings, WebViewDatabase, CookieManager i WebStorage, aby uzyskać szczegółową kontrolę danych prywatności.

Jak API 19 (KitKat) przeglądanie prywatne jest wyłączone. Próba wywołania tego konstruktora z wartością prawdziwych wyników w wyjątku IllegalArgumentException.

Alternatywy je nie będzie nawet marginalnie skuteczne w replikacji zachowanie prywatnego przeglądania. Klasa CookieManager jest singletonem, a wszystkie ustawienia są stosowane do całej aplikacji. W tym podejściu nie ma "drobiazgowej kontroli danych prywatności". Jedyną kontrolką zapewnioną przez CookieManager jest możliwość całkowitego wyłączenia plików cookie, dla KAŻDEGO WebView obecnego w aplikacji. Ta zmiana oznacza, że ​​przeglądarki innych firm nie będą już w stanie odtworzyć funkcji przeglądania prywatnego w przeglądarce Google w jakimkolwiek rozmiarze.

będę ogromnie wdzięczny za wszelkie sugestie dotyczące pracy wokół tego problemu. Na razie nie znajduję w interfejsie API niczego, co mogłoby uczynić jakiekolwiek podobieństwo do możliwości wcześniejszego przeglądania prywatnego.

+0

"Ta zmiana oznacza, że ​​przeglądarki innych firm nie będą już mogły powielać funkcji przeglądania prywatnego w przeglądarce Google w dowolnej wielkości" - co najwyżej ogranicza przeglądarki innych firm, które używają "WebView". Istnieją alternatywne opcje renderowania, takie jak "GeckoView" Mozilli. – CommonsWare

+1

Dzięki, sugerowałem użycie WebView. Zdecydowanie docenisz sugestię GeckoView, będziesz musiał to sprawdzić. W tej notatce jest też projekt ChromeView, który ma podobny cel z silnikiem Chrome: https://github.com/pwnall/chromeview Czytałem, że ten projekt dodaje 30 + MiB do rozmiaru pliku APK (nie osobiście spróbowałem tego). Uważam jednak, że zarówno ChromeView, jak i GeckoView są na wczesnym etapie rozwoju. – tliebeck

Odpowiedz

2

Oprócz tego, co mam w komentarzu, to kolejne miejsce gdzie posiadające wiele procesów jest uzasadnione. Od CookieManager jest singleton, oddzielne procesy będą miały oddzielne instancje CookieManager. „Private Browsing” WebView przypadki mogłyby być w oddzielnym procesie z „regularnego przeglądania” WebView przypadkach.

ten ma wady:

  • Nie może być w tym samym działaniu, w View z jednego procesu nie mogą być wykonane w innym procesie. Jeśli zatem metafora interfejsu użytkownika przeglądarki zakłada kilka widżetów WebView w jednym działaniu (np. Kartach), ta metafora interfejsu użytkownika będzie musiała zostać zmodyfikowana, aby umożliwić "przełączanie kontekstowe" między przeglądaniem zwykłym a prywatnym.

  • Spowoduje to zużycie większej ilości pamięci systemowej, co jest niekorzystne dla użytkownika, aczkolwiek dobre dla programisty (mniejsze prawdopodobieństwo wyjątków od OutOfMemoryError).

+0

Dzięki za sugestię ...w moim własnym przypadku, nie miałbym nic przeciwko używaniu drugiego procesu do przeglądania prywatnego, to nawet dodałoby dodatkową warstwę bezpieczeństwa. Implementacja CookieManager niestety wydaje się być przyczyną problemu, ponieważ wykorzystuje bazę danych przechowywaną w wewnętrznym katalogu danych aplikacji w określonej lokalizacji. Obie instancje CookieManager próbowałyby odczytać/zapisać z tej samej bazy danych. Nie sądzę, że można utworzyć drugi identyfikator użytkownika w jednej aplikacji (ale chciałbym się mylić). – tliebeck

+0

@tliebeck: "ponieważ używa bazy danych przechowywanej w wewnętrznym katalogu danych aplikacji w określonej lokalizacji" - podczas gdy prawda, kluczem jest to, czy 'setAcceptCookie (false)' przebija istnienie bazy danych. Ma się nadzieję, że tak będzie. "Obie instancje CookieManager próbowałyby odczytać/zapisać z tej samej bazy danych" - teoretycznie 'setAcceptCookie (false)' spowodowałoby, że proces nie dotknąłby tej bazy danych. I nawet jeśli tak, jeśli baza danych to SQLite, wiele procesów może to bezpiecznie osiągnąć. – CommonsWare

+0

Dzięki, tak, jest to baza danych SQLite. Zdecydowanie nie chcę, aby proces przeglądania prywatnego był w stanie uzyskać dostęp do ciasteczek, które mogą zostać ustawione w "normalnym" trybie przeglądania. Nadal jednak muszę akceptować ciasteczka w trybie przeglądania prywatnego (muszą przetrwać tylko sesję), ale nie mogę nazwać setAcceptCookie (false). CookieSyncManager może się tu przydać, ale dokumentacja jego zachowania jest nieco słaba. Jeśli jego metoda stopSync() eliminuje jakąkolwiek szansę na synchronizację z tą bazą danych, Twoje rozwiązanie może działać. – tliebeck