iOS端WebView业务场景“IP直连”方案说明

重要

当前最佳实践文档只针对结合使用时,如何使用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