当前最佳实践文档只针对结合使用时,如何使用HTTPDNS解析出的IP,关于HTTPDNS本身的解析服务,请先查看iOS SDK 开发手册。
背景说明
在App WebView加载网络请求场景下,Android/iOS系统可基于系统API进行网络请求拦截,并实现自定义逻辑注入,如使用HTTPDNS进行基于IP的直连请求。但iOS系统在Webview场景下拦截网络请求后,需要接管基于IP的网络请求的发送、数据接收、页面重定向、页面解码、Cookie、缓存等逻辑;综合来看,Webview场景下HTTPDNS的使用(IP直连进行网络请求)门槛比较高,移动操作系统针对这个场景的支持粒度很粗,且存在一些缺陷,需要开发者具备较强的网络/OS Framework的代码级掌控能力来规避和优化上述问题。
方案概述
基于
NSURLProtocol
可拦截iOS系统上基于上层网络库NSURLConnection/NSURLSession
发出的网络请求,WebView发出的请求同样包含在内。通过以下接口注册自定义
NSURLProtocol
,用于拦截WebView上层网络请求,并创建新的网络请求接管数据发送、接收、重定向等处理逻辑,将结果反馈给原始请求。[NSURLProtocol registerClass:[CustomProtocol class]];
自定义
NSURLProtocol
处理过程概述:在
canInitWithRequest
中过滤需要做HTTPDNS域名解析的请求。请求拦截后,做HTTPDNS域名解析。
解析完成后,同普通请求一样,替换URL.host字段,替换HTTP Header Host域,并接管该请求的数据发送、接收、重定向等处理。
通过
NSURLProtocol
的接口,将请求处理结果反馈到WebView原始请求。
NSURLProtocol使用参考Apple NSURLProtocol API,苹果官方示例代码参考Apple Sample Code - CustomHTTPProtocol。