IOS网络开发NSURLSession详解(一)概述
一. 概述
NSURLSession是iOS SDK提供的一组相对容易使用的网络API。它包括几个部分NSURLRequest,NSURLCache、NSURLSession、NSURLSessionConfiguration,NSURLSessionTask。iOS的网络编程除了NSURLSession,也可以使用NSURLConnection,后者易用性教差。网络开发整体包括五个部分
支持的协议(例如http)
授权和证书(例如服务器要求提供用户名密码)
cookie存储(例如不存储cookie)
cache管理(例如只在内存cache,不cache到硬盘)
配置管理(例如http headers等配置信息)
二 简单介绍下NSURLSession的几个核心类
1.1 NSURLSessionConfiguration
指定NSURLSession的配置信息。这些配置信息决定了NSURLSession的种类,HTTP的额外headers,请求的timeout时间,Cookie的接受策略等配置信息。
这里详情讲解下三种NSURLSessionConfiguration,这决定了NSURLSession种类
- (NSURLSessionConfiguration *)defaultSessionConfiguration,使用基于硬盘的持久化Cache,保存用户的证书到钥匙串,使用共享cookie存储
- (NSURLSessionConfiguration *)emhemeralSessionConfiguration配置信息和default大致相同。除了不会把cache、证书或者任何和Session相关的数据存储到硬盘,而是存储在内存中,生命周期和Session一致。比如浏览器无痕浏览等功能就可以基于这个来做。
- (NSURLSessionConfiguration *)backgroundSessionConfigurationWithIdentifier:(NSString )identifier创建一个可以在后台甚至APP已经关闭的时候仍然传输数据的会话。注意,后台Session一定要在创建的时候赋予一个唯一的identifier,这样在APP下次运行的时候,能够根据identifier来进行相关的区分。如果用户关闭了APP,iOS系统会关闭所有的background Session。而且被用户强制关闭了以后,iOS系统不会主动唤醒APP,只有用户下次启动了APP,数据传输才会传输。
1.2 NSURLSessionTask
DataTask - 用来请求资源,然后服务器返回数据,再内存中存储为NSData格式。default,ephemeral,shared Session支持data task. background session不支持。
Upload Task - 和Data Task类似,只不过在请求的时候提供了request body。并且background Session 支持upload task
Download Task - 下载内容到硬盘上,所有类型的Session都支持。
注意: 创建的task都是挂起状态,需要resume才能执行。
1.3 NSURLSession
会话是基于NSURLSession网络开发的核心组件。由上文的Configuration来配置,然后作为工厂,创建NSURLSessionTask来进行实际的数据传输任务
self.session = [NSURLSession sesstionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
创建一个task
NSURLSessionDataTask *dataTask = [self.session dataTaskWithURL:[NSURL URLWithString:imageURL] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error){}]
1.4 NSURLRequest
指定请求的URL和cache策略
例如,如下这个初始化函数
(instancetype)requestWithURL:(NSURL *)theURL
就是在初始化的时候指定url,cachePolicy以及timeoutinterval
通过NSURLRequest可以设置HTTPMethod,默认是GET
1.5 NSURLCache
cache URL 请求返回的response。
实现的方式是把NSURLRequest对象映射到NSCachedURLReponse对象。可以设置在内存中缓存的大小,以及在磁盘中缓存的大小和路径。不是特别需要的话,使用Shared Cached足以,如果有特别需要,创建一个NSURLCache对象,然后通过+ setSharedURLCache来设定
当然,通过这个类也可以获得当前cache的使用情况。
1.6 NSURLResponse NSHTTPURLResponse
通过REST API进行资源操作的时候,有request必须就有response。NSURLResponse包含了metadata,例如返回的数据长度(expectedContentLength)MIME类型 text编码方式
NSHTTPURLResponse是NSURLResponse的子类,由于绝大部分的REST都是HTTP的,所以,通常遇到的都NSHTTPURLResponse对象。通过这个对象可以获得:HTTP的headers,status Code等信息,其中:HTTP headers包含的信息较多
1.7 NSURLCredential
用来处理证书信息。比如用户名密码,服务器授权等,根据不同的认证方式来处理。
基于用户名密码的认证
+ (NSURLCredential *)credentialWithUser:(NSString *)user password:(NSString *)password persistence:(NSURLCredentialPersistence)persiste
基于证书的
+ credentialWithIdentity:certificates:persistence
1.8 NSURLAuthenticationChallenge
在访问资源的时候,可能服务器会返回需要授权(提供一个NSURLCredential对象)。那么,URLSession:task:didReceiveChallenge:completionHandler被调用。需要的授权信息会保存在这个类的对象里。
1.9 NSURLProtectionSpace
这个类的对象代表了服务器上的一块需要授权信息的区域,通过这个对象信息来响应Challenge。比如:如果服务器需要一个基于用户名密码的认证,那么应该先参考下NSURLProtectionSpace对象的host,port,realm,protocol等信息,然后依照这个信息提供证书
网友评论