概述
CFNetwork是一个高性能的低级框架,可以控制一些更底层的东西,如各种常用网络协议、socket通讯等,实际上除了socket是传输层之外,本质上还是应用层上的封装的通用API。使用者可以不用关心底层协议的实际细节。
(图片来源于官方文档)
目前iOS的网络编程分四层:
- WebKit:属于Cocoa层,苹果很多地方用到的页面渲染引擎;
- NSURL:也属于Cocoa层,对各类URL请求的封装;
- CFNetwork:属于Core Foundation层,基于C的封装,同样的还有CFNetServices;
- BSD sockets:属于OS层,也是基于C的封装;
框架结构
CFNetwork框架包括的类库如下:
(图片来源于官方文档)
可以看到,CFNetwork的基础是CFSocket和CFStream。
CFSocket API
Socket是网络通讯的底层基础,可以让两个socket端口互发数据。最常用的socket抽象是BSD socket了。而CFSocket则是BSD socket的抽象,基本上实现了几乎所有BSD socket的功能,并且还融入了run loop。
CFStream API
CFStream API提供了与设备无关的读写数据的方法。使用它可以为内存、文件、网络(使用socket)的数据建立stream,能使用stream而不必马上把所有数据都写入到内存中。
CFStream提供API对两种CFType对象提供抽象:CFReadStream and CFWriteStream。它同时也是CFHTTP和CFFTP的基础。
CFFTP API
对用FTP协议通信的封装,能下载、上传文件和目录到FTP服务器。CFFTP建立的连接可以是同步或者异步。
CFHTTP API
是HTTP协议的抽象,用CFHTTP API来创建一个HTTP请求,需要指定以下信息:
- 请求方法,如OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、和CONNECT;
- 请求的URL地址;
- HTTP版本, 如version 1.0或1.1;
- 消息头部,如User-Agent等;
- 消息的主体;
一个例子(来源于官方文档):
// 请求主体内容
CFStringRef bodyString = CFSTR(""); // Usually used for POST data
CFDataRef bodyData = CFStringCreateExternalRepresentation(kCFAllocatorDefault,
bodyString, kCFStringEncodingUTF8, 0);
// http头内容
CFStringRef headerFieldName = CFSTR("X-My-Favorite-Field");
CFStringRef headerFieldValue = CFSTR("Dreams");
// url地址
CFStringRef url = CFSTR("http://www.apple.com");
CFURLRef myURL = CFURLCreateWithString(kCFAllocatorDefault, url, NULL);
CFStringRef requestMethod = CFSTR("GET");
CFHTTPMessageRef myRequest = CFHTTPMessageCreateRequest(kCFAllocatorDefault, requestMethod, myURL, kCFHTTPVersion1_1);
CFDataRef bodyDataExt = CFStringCreateExternalRepresentation(kCFAllocatorDefault, bodyData, kCFStringEncodingUTF8, 0);
// 设置好主体内容
CFHTTPMessageSetBody(myRequest, bodyDataExt);
// 设置http头信息
CFHTTPMessageSetHeaderFieldValue(myRequest, headerFieldName, headerFieldValue);
// 序列化请求
CFDataRef mySerializedRequest = CFHTTPMessageCopySerializedMessage(myRequest);
其他API
- CFHTTPAuthentication API
- CFHost API
- CFNetDiagnostics API
TODO
- CFReadStream
- CFWriteStream