Marks

iOS开发者,喜欢研究技术。

0%

iOS原生网络请求

一、URL Session的基本概念

1. 三种工作模式:

  • 默认会话模式(default):工作模式类似于原来的NSURLConnection,使用的是基于磁盘缓存的持久化策略,使用用户keychain中保存的证书进行认证授权。
  • 瞬时会话模式(ephemeral):该模式不使用磁盘保存任何数据。所有和会话相关的caches,证书,cookies等都被保存在RAM中,因此当程序使会话无效,这些缓存的数据就会被自动清空。
  • 后台会话模式(background):该模式在后台完成上传和下载,在创建Configuration对象的时候需要提供一个NSString类型的ID用于标识完成工作的后台会话。

2. NSURLSession支持的四种任务

NSURLSession类支持四种类型的任务:加载数据,下载和上传,建立一个TCP/IP连接。

二、相关的类

1. NSURLConnection和NSURLSession

NSURLConnection这个名字,实际上指的是一组构成Foundation框架中URL加载系统的相互关联的组件:NSURLRequest,NSURLResponse,NSURLProtocol,NSURLCache,NSHTTPCookieStorage,NSURLCredentialStorage,以及和它同名的NSURLConnection。
在WWDC 2013中,Apple的团队对NSURLConnection进行了重构,并推出了NSURLSession作为替代。
NSURLSession也是一组相互依赖的类,它的大部分组件和NSURLConnection中的组件相同如NSURLRequest,NSURLCache等。而NSURLSession的不同之处在于,它将NSURLConnection替换为NSURLSession和NSURLSessionConfiguration,以及4个NSURLSessionTask的子类:NSURLSessionDataTask, NSURLSessionUploadTask, NSURLSessionDownloadTask,NSURLSessionStreamTask。

iOS为了适应不同的应用场景提供了不同类型的NSURLSessionTask

  • NSURLSessionTask : Task的抽象基类
  • NSURLSessionDataTask //一般的get、post等请求
  • NSURLSessionUploadTask // 用于上传文件或者数据量比较大的请求
  • NSURLSessionDownloadTask //用于下载文件或者数据量比较大的请求
  • NSURLSessionStreamTask //建立一个TCP/IP连接的主机名和端口或一个网络服务对象。可以执行一个异步的读写

2. NSURLSessionConfiguration

NSURLConnection是全局性的,即它的配置对全局有效,如果有两个链接需要不同的cookies、证书这些公共资源,则NSURLConnection无法满足要求,这时NSURLSession的优势则体现出来,NSURLSession可以同过NSURLSessionConfiguration可以设置全局的网络访问属性。

1
2
3
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
// delegateQueue:请求完成回调函数和代理函数的运行线程,如果为nil则系统自动创建一个串行队列,不影响sessionTask的运行线程
NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];

三种会话方式:

  1. defaultSessionConfiguration:进程内会话(默认会话),类似 NSURLConnection的标准配置,用硬盘来缓存数据。
  2. ephemeralSessionConfiguration:临时的进程内会话(内存),不会将cookie、缓存储存到本地,只会放到内存中,当应用程序退出后数据也会消失,可以用于实现“秘密浏览”。
  3. backgroundSessionConfiguration:建立后台会话可以在应用程序挂起,退出,崩溃的情况下运行上传和下载任务,后台另起一个线程。另外,系统会根据设备的负载程度决定分配下载的资源,因此有可能会很慢甚至超时失败。

设置一些网络属性:

  • HTTPAdditionalHeaders:可以设置出站请求的数据头
1
2
3
4
5
6
configuration.HTTPAdditionalHeaders = @{ 
@"Accept": @"application/json",
@"Accept-Language": @"en",
@"Authorization": authString,
@"User-Agent": userAgentString
};
  • networkServiceType,设置网络服务类型
    • NSURLNetworkServiceTypeDefault 默认
    • NSURLNetworkServiceTypeVoIP VoIP
    • NSURLNetworkServiceTypeVideo 视频
    • NSURLNetworkServiceTypeBackground 后台
    • NSURLNetworkServiceTypeVoice 语音
    • NSURLNetworkServiceTypeCallSignaling 电话
  • allowsCellularAccess:允许蜂窝访问
  • timeoutIntervalForRequest:请求的超时时长
  • timeoutIntervalForResource:响应的超时时长
  • requestCachePolicy:缓存策略

注意事项:如果是自定义会话并指定了代理,会话会对代理进行强引用,在视图控制器销毁之前,需要取消网络会话,否则会造成内存泄漏