我在Android应用程序中使用WebView。 WebViewClient用于拦截目标“ https://” REST请求,以便我可以在本机客户端进行一些自定义处理。
问题是仅在应用程序首次运行时才调用WebViewClient.shouldInterceptRequest(WebView,WebResourceRequest)。对相同REST服务的后续网络请求将不再调用shouldInterceptRequest()。我必须卸载该应用程序或在“应用程序信息”系统设置中“清除存储”,才能再次调用shouldInterceptRequest()。
要排除网站缓存服务响应的可能性,我使用Charles Proxy监视网络流量。我可以看到,每次加载网页时都会发出一个新的网络请求,无论是否触发了InterInterRequest()。
在第一次之后不应该调用shouldInterceptRequest()的原因可能是什么?
答案 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上进行设置。