Android WebViewClient.shouldInterceptRequest () вызывается только в первый раз

Я использую WebView в приложении для Android. WebViewClient используется для перехвата целевого запроса "https: //" REST, чтобы я мог выполнять некоторую настраиваемую обработку на стороне собственного клиента.

Проблема в том, что WebViewClient.shouldInterceptRequest (WebView, WebResourceRequest) вызывается только при первом запуске приложения. Последующие сетевые запросы к той же службе REST больше не вызывают shouldInterceptRequest (). Мне нужно либо удалить приложение, либо «Очистить хранилище» в настройках системы «Информация о приложении», чтобы он снова вызвал shouldInterceptRequest ().

Чтобы исключить возможность того, что веб-сайт кэширует ответ службы, я использую Charles Proxy для отслеживания сетевого трафика. Я вижу, что новый сетевой запрос выполняется каждый раз при загрузке веб-страницы, независимо от того, запускается ли InterceptRequest () или нет.

По каким причинам shouldInterceptRequest () не вызывается с первого раза?


person hli    schedule 20.12.2019    source источник


Ответы (2)


Оказывается, веб-приложение, которое я пытаюсь встроить, использует Service Worker в браузере. Сетевые запросы, сделанные Service Worker, не могут быть перехвачены WebViewClient. Чтобы перехватить сетевые запросы Service Worker, необходимо использовать ServiceWorkerClientCompat.

Для меня решение состоит в том, чтобы настроить ОБА WebServiceClient и ServiceWorkerClient, поскольку работник службы имеет собственный жизненный цикл и может не активироваться в некоторых случаях (например, при первом запуске приложения).

Пример кода выглядит следующим образом.

if (WebViewFeature.isFeatureSupported(WebViewFeature.SERVICE_WORKER_BASIC_USAGE)) {
   ServiceWorkerControllerCompat.getInstance().setServiceWorkerClient(
          object : ServiceWorkerClientCompat() {
              override fun shouldInterceptRequest(request: WebResourceRequest): WebResourceResponse? {
                  // custom handling
              }
   })
}
person hli    schedule 06.01.2020

Чтобы захватить все сетевые запросы из веб-просмотра, вам также необходимо учитывать Service Workers. Вызовы обслуживающего работника могут быть перехвачены, но для этого их необходимо настроить в ServerWorkerController.

person ThisCompSciGuy    schedule 19.08.2020