CFNetwork框架

概述

CFNetwork是一个高性能的低级框架,可以控制一些更底层的东西,如各种常用网络协议、socket通讯等,实际上除了socket是传输层之外,本质上还是应用层上的封装的通用API。使用者可以不用关心底层协议的实际细节。

(图片来源于官方文档)

目前iOS的网络编程分四层:

  1. WebKit:属于Cocoa层,苹果很多地方用到的页面渲染引擎;
  2. NSURL:也属于Cocoa层,对各类URL请求的封装;
  3. CFNetwork:属于Core Foundation层,基于C的封装,同样的还有CFNetServices;
  4. 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请求,需要指定以下信息:

  1. 请求方法,如OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、和CONNECT;
  2. 请求的URL地址;
  3. HTTP版本, 如version 1.0或1.1;
  4. 消息头部,如User-Agent等;
  5. 消息的主体;

一个例子(来源于官方文档):

// 请求主体内容
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

参考资料