📄
Henry
  • Henry的神秘小屋
  • 其他
    • 字节码与机器码的区别?
  • ObjectiveC
    • NSInvocation
    • 检测OC项目中未使用的方法
    • Method Selector
    • 消息转发
  • Swift
    • 检测Swift项目中未使用的类 方法 属性
    • NSCoding
    • Mirror
    • JSONEncode JSONDecode
    • Any AnyObject AnyClass
    • is as? as! as
  • Cocoapods
    • 看懂Podfile.lock文件
    • 在编写的Pod中使用宏预编译
  • iOS
    • 苹果应用 保持画面流畅
    • 关于计算机展示图像的一些问题
    • @testable
    • iOS中URLRequest的缓存策略
    • CodePush接入流程
    • H5在WKWebView中读取沙盒文件
    • FDLog App客户端日志系统
    • 如何实现JSBridge基于WKWebView
    • 网络请求各个指标的度量
    • iOS13 UIModalPresentationStyle
    • 实现H5离线包机制
    • NSURLProtocol 拦截器
    • Framework
    • Lock
    • CFNetwork NSURLSession NSURLConnection
    • setNeedsLayout layoutIfNeeded layoutSubviews
    • StackView
    • Flutter Method Channel:从Dart到Native调用链
    • JSONSerialization.ReadingOptions
    • JSONSerialization.WritingOptions
    • RunLoop高级2
    • RunLoop高级1
    • RunLoop中级
    • RunLoop初级
    • LineBreak AutoShrink
    • 如何给H5出WebView调试包
    • TODO、FIXME、!!!、???、MARK
    • Operation的使用
    • UserDefault
    • 了解WKWebView
    • 输出日志信息到系统控制台
    • Float Double 失去精度问题
    • 使用xcodebuild命令打包导出
    • 在iOS项目中使用C++定义的模块
    • 证书问题
    • 创建常驻线程
  • 源码
    • 阅读PINCache源码
    • 解读AspectHook
    • HandyJSON是如何实现的?
  • 汇编
    • 看懂汇编
由 GitBook 提供支持
在本页
  • 内容
  • 一,iOS 网络层的架构
  • 二,NSURLSession 和 NSURLConnection 关系?
  • 三,总结

这有帮助吗?

  1. iOS

CFNetwork NSURLSession NSURLConnection

上一页Lock下一页setNeedsLayout layoutIfNeeded layoutSubviews

最后更新于5年前

这有帮助吗?

request.jpg

CFNetworkDemo:

本文项目 Demo:

参考 WWDC PDF:

内容

  • iOS 网络层的架构

  • NSURLSession 和 NSURLConnection 层级关系?

  • 总结

一,iOS 网络层的架构

从 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 的时候却走了这个方法。

二,NSURLSession 和 NSURLConnection 关系?

虽然我们知道了 NSURL 层有两个类,NSURLSession 和 NSURLConnection,但是我们还是不清楚,他们之间的关系,我也是好奇者之一,于是我做了一个 Example 来验证自己的想法。

3.发起请求,然后发现,断点卡在了 URLSession 的便利构造器的方法上面,因为我 hook 了系统的这个方法,所以断点走到了这里。 这个时候我就可以得出一个结论。

三,总结

经过自己的例子,和官方文档的资料,我们认为 iOS 当中的网络框架结构是这样的。

WechatIMG998.png
WechatIMG1015.png
WechatIMG1016.jpeg
WechatIMG1017.jpeg

1.添加类别方法,+load 方法里面做方法交换,来 hook,URLSession 的两个构造器方法,可以忽略 MyURLProtocol 这句,这句是用来 hook

2.在 ViewController 视图控制器中,使用 URLConnection,请求一条 POST 的请求。

结论: 从下图我们可以看出,我们调用了 NSURLConnection,但是却走到了 NSURLSession 的便利构造器里面。所以,我们可以认为,NSURLConnection 封装了 NSURLSession 方法。

WechatIMG1002.png
https://github.com/zColdWater/CFNetworkDemo
https://github.com/zColdWater/BetweenSessionAndConnectionDemo
https://github.com/zColdWater/Resources/blob/master/Images/707_whats_new_in_foundation_networking.pdf
WechatIMG999.png
image.png
WechatIMG1001.png