CFNetwork NSURLSession NSURLConnection
最后更新于
最后更新于
CFNetworkDemo: https://github.com/zColdWater/CFNetworkDemo
本文项目 Demo: https://github.com/zColdWater/BetweenSessionAndConnectionDemo
参考 WWDC PDF: https://github.com/zColdWater/Resources/blob/master/Images/707_whats_new_in_foundation_networking.pdf
iOS 网络层的架构
NSURLSession 和 NSURLConnection 层级关系?
总结
从 CFNetwork 的官方介绍的架构图上可以看到,他们的关系是:
1.最上层: UIWebView 和 WKWebView 使用的 WebKit 封装的 NSURL(也就是封装的,NSURLSession,NSURLConnection)
2.NSURL 层: NSURLSession 和 NSURLConnection 在这层,也就是我们平时常用的 API,它封装的 CFNetwork。
3.CFNetwork 层: CFNetwork 这层的 API 全部是 C 函数,我们平时开发一般情况下肯定不会使用它,因为有接口更有好的 NSURL 层,我们知道它又是封装的 BSD sockets 层
4.BSD sockets: 这层就是最底层的 Socket 层,平时开发基本就没接触过这层。
我们再看一张苹果 WWDC 介绍 Network 架构截图 从中可以看出,URLSession 和 URLConnection 是平级的,但是,你往下看我们验证的关系,似乎在 URLConnection 里面调用了 URLSession,否则为什么我们 Hook URLSession 的构造器,使用 URLConnection 的时候却走了这个方法。
虽然我们知道了 NSURL 层有两个类,NSURLSession 和 NSURLConnection,但是我们还是不清楚,他们之间的关系,我也是好奇者之一,于是我做了一个 Example 来验证自己的想法。
3.发起请求,然后发现,断点卡在了 URLSession 的便利构造器的方法上面,因为我 hook 了系统的这个方法,所以断点走到了这里。 这个时候我就可以得出一个结论。
经过自己的例子,和官方文档的资料,我们认为 iOS 当中的网络框架结构是这样的。
1.添加类别方法,+load 方法里面做方法交换,来 hook,URLSession 的两个构造器方法,可以忽略 MyURLProtocol 这句,这句是用来 hook
2.在 ViewController 视图控制器中,使用 URLConnection,请求一条 POST 的请求。
结论: 从下图我们可以看出,我们调用了 NSURLConnection,但是却走到了 NSURLSession 的便利构造器里面。所以,我们可以认为,NSURLConnection 封装了 NSURLSession 方法。