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

时间:2019-12-20 16:06:29

标签: android android-webview webviewclient

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

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

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

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

2 个答案:

答案 0 :(得分: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
              }
   })
}

答案 1 :(得分:0)

要从Web视图捕获所有网络请求,您还需要考虑服务人员。服务人员的呼叫可以被拦截,但需要在ServerWorkerController上进行设置。