仅首次调用Android的WebViewClient.shouldInterceptRequest()

问题描述 投票:0回答:1

我在Android应用中使用WebView。 WebViewClient用于拦截目标“ https://” REST请求,以便我可以在本机客户端上执行一些自定义处理。

问题是,仅在应用程序首次运行时才调用WebViewClient.shouldInterceptRequest(WebView,WebResourceRequest)。对相同REST服务的后续网络请求将不再调用shouldInterceptRequest()。我必须卸载应用程序或在“应用程序信息”系统设置中“清除存储”,才能再次调用shouldInterceptRequest()。

为了排除网站缓存服务响应的可能性,我使用Charles Proxy监视网络流量。我可以看到,每次加载网页时都会发出一个新的网络请求,无论是否触发了InterceptRequest()。

第一次之后不应该调用shouldInterceptRequest()的原因是什么?

android android-webview webviewclient
1个回答
0
投票

事实证明,我要嵌入的Web应用程序使用浏览器Service Worker。 Web客户端无法拦截Service Worker发出的网络请求。为了拦截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
              }
   })
}
© www.soinside.com 2019 - 2024. All rights reserved.