1. 背景说明
在App WebView加载网络请求场景下,Android/iOS系统可基于系统API进行网络请求拦截,并实现自定义逻辑注入,如使用HTTPDNS进行基于IP的直连请求。但iOS系统在Webview场景下拦截网络请求后,需要自行接管基于IP的网络请求的发送、数据接收、页面重定向、页面解码、Cookie、缓存等逻辑;Android除了上述iOS遇到的问题外,不同版本的ROM的网络请求拦截能力还存在差异,比如低版本Android ROM基于系统API拦截的网络请求会丢失请求方法、Body信息等。综合来看,Webview场景下HTTPDNS的使用(IP直连进行网络请求)门槛比较高,移动操作系统针对这个场景的支持粒度很粗,且存在一些缺陷,需要开发者具备较强的网络/OS Framework的代码级掌控能力来规避和优化上述问题。
2. 方案概述
2.1 Android
- 通过以下API对
WebView
进行配置;void setWebViewClient (WebViewClient client);
- 通过重写
WebViewClient
中以下方法拦截WebView的网络请求,获取请求URL.host进行HTTPDNS域名解析,解析完成后处理方式和普通网络请求一致,替换URL.host字段,设置HTTP Header Host域,最后返回新请求对应的WebResourceResponse。
/**
* 拦截WebView网络请求(Android API < 21)
* 只能拦截网络请求的URL,请求方法、请求内容等无法拦截
*/
public WebResourceResponse shouldInterceptRequest(WebView view,
String url);
/**
* 拦截WebView网络请求(Android API >= 21)
* 通过解析WebResourceRequest对象获取网络请求相关信息
*/
public WebResourceResponse shouldInterceptRequest(WebView view,
WebResourceRequest request);
- 使用方式参考Android WebClient API。
2.2 iOS
- 基于
NSURLProtocol
可拦截iOS系统上基于上层网络库NSURLConnection/NSURLSession
发出的网络请求,WebView发出的请求同样包含在内; - 通过以下接口注册自定义
NSURLProtocol
,用于拦截WebView上层网络请求,并创建新的网络请求接管数据发送、接收、重定向等处理逻辑,将结果反馈给原始请求。[NSURLProtocol registerClass:[CustomProtocol class]];
- 自定义
NSURLProtocol
处理过程概述:- 在
canInitWithRequest
中过滤要需要做HTTPDNS域名解析的请求; - 请求拦截后,做HTTPDNS域名解析;
- 解析完成后,同普通请求一样,替换URL.host字段,替换HTTP Header Host域,并接管该请求的数据发送、接收、重定向等处理;
- 通过
NSURLProtocolClient
的接口,将请求处理结果反馈到WebView原始请求。
- 在
- NSURLProtocol使用参考Apple NSURLProtocol API,苹果官方示例代码参考Apple Sample Code – CustomHTTPProtocol。
原创文章,作者:网友投稿,如若转载,请注明出处:https://www.cloudads.cn/archives/34132.html