完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
“IP直连方案”主要在于解决DNS污染、省去DNS解析时间,通常情况下我们可以在项目中使用 NSURLProtocol 拦截 NSURLSession 请求,下面将支持 Post 请求中面临的一个挑战,以及应对策略介绍一下: 在支持POST请求过程中会遇到丢失 body的 问题,有以下几种解决方法: 方案如下:
对方案做以下分析
上面是我给出的实现,这里注意,刚开始有人做过这样的实现: 这个实现的问题在于:不能用 [stream hasBytesAvailable]) 判断,处理图片文件的时候这里的[stream hasBytesAvailable]会始终返回YES,导致在while里面死循环。 Apple的文档也说得很清楚: 给出了实现,下面介绍下使用方法: 在用于拦截请求的 NSURLProtocol 的子类中实现方法 +canonicalRequestForRequest: 并处理 request 对象: 下面介绍下相关方法的作用: 翻译下:
简单说:
这里有一个注意点:+[NSURLProtocol canonicalRequestForRequest:] 的执行条件是 +[NSURLProtocol canInitWithRequest:] 返回值为 YES。 注意在拦截 NSURLSession 请求时,需要将用于拦截请求的 NSURLProtocol 的子类添加到 NSURLSessionConfiguration 中,用法如下: 换用其他提供了SNI字段配置接口的更底层网络库 如果使用第三方网络库:curl, 中有一个 -resolve 方法可以实现使用指定 ip 访问 https 网站,iOS 中集成 curl 库,参考 curl文档 ; 另外有一点也可以注意下,它也是支持 IPv6 环境的,只需要你在 build 时添加上 --enable-ipv6 即可。 curl 支持指定 SNI 字段,设置 SNI 时我们需要构造的参数形如: {HTTPS域名}:443:{IP地址} 假设你要访问. www.example.org ,若IP为 127.0.0.1 ,那么通过这个方式来调用来设置 SNI 即可: iOS CURL 库 使用libcurl 来解决,libcurl / cURL 至少 7.18.1 (2008年3月30日) 在 SNI 支持下编译一个 SSL/TLS 工具包,curl 中有一个 --resolve 方法可以实现使用指定ip访问https网站。 在iOS实现中,代码如下 其中 curlHost 形如: {HTTPS域名}:443:{IP地址} _hosts_list 是结构体类型hosts_list,可以设置多个IP与Host之间的映射关系。curl_easy_setopt方法中传入CURLOPT_RESOLVE 将该映射设置到 HTTPS 请求中。 这样就可以达到设置SNI的目的。 我在这里写了一个 Demo:CYLCURLNetworking,里面包含了编译好的支持 IPv6 的 libcurl 包,演示了下如何通过curl来进行类似NSURLSession。 参考链接:
注意以上讨论不涉及 WKWebView 中拦截 NSURLSession 请求的 body 丢失问题。 文中提到的几个概念: 文中部分提到的域名,如果没有特殊说明均指的是 FQDN。 原文:https://yq.aliyun.com/articles/543412/?spm=a2c41.11181499.0.0 |
|
相关推荐 |
|
BP86211D 12V/0.5A家用电器方案DEMO资料分析(电路原理图及BOM)
1505 浏览 0 评论
PD诱骗取电芯片_PD_Sink端芯片之XSP05实战应用电路
2515 浏览 1 评论
BLDC、PMSM电机智能栅极驱动芯片之TMC6140知识分享
1260 浏览 0 评论
国产电源芯片DP4054 软硬件兼容TP4054 规格书资料
1726 浏览 0 评论
3534 浏览 3 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-14 08:01 , Processed in 1.630484 second(s), Total 51, Slave 37 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
2884