Частный просмотр устарел в Android WebView начиная с API 17. Какова альтернатива?

Спецификация API для конструктора WebView, позволяющего включить приватный просмотр, гласит следующее:

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

WebView(Context context, AttributeSet attrs, int defStyle, boolean privateBrowsing)

Этот конструктор устарел на уровне API 17. Частный просмотр больше не поддерживается напрямую через WebView и будет удален в следующем выпуске. Предпочитаю использовать WebSettings, WebViewDatabase, CookieManager и WebStorage для детального управления конфиденциальными данными.

Начиная с API 19 (KitKat) приватный просмотр отключен. Попытка вызвать этот конструктор со значением true приводит к возникновению исключения IllegalArgumentException.

Предлагаемые альтернативы не будут даже незначительно эффективны в воспроизведении поведения приватного просмотра. Класс CookieManager является одноэлементным, все настройки которого применяются ко всему приложению. При таком подходе нет «тонкого контроля данных о конфиденциальности». Единственный элемент управления, предоставляемый CookieManager, — это возможность полностью отключить файлы cookie для КАЖДОГО веб-представления, присутствующего в приложении. Это изменение означает, что сторонние браузеры больше не могут воспроизводить функцию приватного просмотра собственного браузера Google в любом качестве.

Я был бы очень признателен за любые предложения по работе с этим поведением. На данный момент я не могу найти ничего в API, что сделало бы возможным какое-либо сходство с прежней возможностью частного просмотра.


person tliebeck    schedule 22.11.2013    source источник
comment
Это изменение означает, что сторонние браузеры больше не могут воспроизводить функцию приватного просмотра собственного браузера Google в любом качестве — в лучшем случае это ограничивает сторонние браузеры, использующие WebView. Существуют альтернативные варианты рендеринга, такие как GeckoView от Mozilla.   -  person CommonsWare    schedule 22.11.2013
comment
Спасибо, я имел в виду использование WebView. Определенно ценю предложение GeckoView, нужно будет его проверить. В этой заметке есть также проект ChromeView, который имеет аналогичную цель с движком Chrome: github.com/pwnall/ chromeview Я читал, что этот проект увеличивает размер APK на 30+ МБ (хотя лично не пробовал). Я считаю, что и ChromeView, и GeckoView находятся на ранних стадиях разработки.   -  person tliebeck    schedule 22.11.2013


Ответы (1)


В дополнение к тому, что у меня есть в комментарии, это еще одно место, где оправдано наличие нескольких процессов. Поскольку CookieManager является синглтоном, отдельные процессы будут иметь отдельные экземпляры CookieManager. Экземпляры «частного просмотра» WebView могут находиться в отдельном процессе от экземпляров «обычного просмотра» WebView.

У этого есть минусы:

  • Они не могут находиться в одном и том же действии, так как View из одного процесса не может быть отображено в другом процессе. Таким образом, если метафора пользовательского интерфейса для браузера подразумевает несколько WebView виджетов в одном действии (например, вкладки), эту метафору пользовательского интерфейса необходимо будет изменить, чтобы обеспечить «переключение контекста» между обычным и приватным просмотром.

  • Это потребует больше системной оперативной памяти, что плохо для пользователя, хотя и хорошо для разработчика (меньше вероятность OutOfMemoryError исключений).

person CommonsWare    schedule 22.11.2013
comment
Спасибо за предложение... в моем случае я был бы не против использовать второй процесс для приватного просмотра, это даже добавило бы дополнительный уровень безопасности. Реализация CookieManager, к сожалению, вызывает здесь проблему, поскольку она использует базу данных, хранящуюся во внутреннем каталоге данных приложения в определенном месте. Оба экземпляра CookieManager попытаются выполнить чтение/запись из одной и той же базы данных. Я не думаю, что можно создать второй идентификатор пользователя в одном приложении (но хотелось бы ошибиться). - person tliebeck; 22.11.2013
comment
@tliebeck: поскольку он использует базу данных, хранящуюся во внутреннем каталоге данных приложения в определенном месте, - хотя это и правда, ключ в том, превосходит ли setAcceptCookie(false) существование базы данных. Остается надеяться, что так и будет. Оба экземпляра CookieManager будут пытаться читать/записывать из одной и той же базы данных — теоретически setAcceptCookie(false) приведет к тому, что процесс не будет касаться этой базы данных. И даже если они это сделают, если база данных SQLite, несколько процессов могут безопасно использовать это. - person CommonsWare; 22.11.2013
comment
Спасибо, да, это база данных SQLite. Я определенно не хочу, чтобы процесс приватного просмотра мог получить доступ к потенциально установленным файлам cookie в обычном режиме просмотра. Мне по-прежнему нужно принимать файлы cookie в режиме приватного просмотра (они должны сохраняться только в течение сеанса), но я не могу вызвать setAcceptCookie(false). CookieSyncManager может оказаться полезным здесь, но он немного скуден в документации своего поведения. Если его метод stopSync() исключает возможность синхронизации с этой базой данных, ваше решение может работать. - person tliebeck; 22.11.2013
comment
До сих пор мне не удалось заставить Cookie (Sync) Manager вести себя так, как хотелось бы. Когда второй процесс (приватный просмотр) завершается, файлы cookie синхронизируются. Все еще нужно немного поиграть с ним и покопаться в коде Android. - person tliebeck; 26.11.2013
comment
Я знаю, что эта тема довольно старая, но я столкнулся с той же проблемой. Я хотел бы обрабатывать несколько веб-просмотров, некоторые из которых находятся в обычном режиме просмотра, а другие - в режиме частного просмотра. Нашли ли вы какие-либо надежные решения или обходной путь? Я пытался сохранить все файлы cookie в базе данных Room db и восстанавливать их каждый раз, когда мне нужен обычный режим просмотра, но, к сожалению, мне это не удалось. - person Yogi Bear; 30.09.2018
comment
@tliebeck Привет, я немного опаздываю на вечеринку, но я был бы очень признателен, если бы вы поделились решением, к которому вы пришли. - person Alex Berdnikov; 07.05.2019
comment
нашел какое-нибудь решение для приватного просмотра? - person Bharat Kumar; 02.06.2021