1 iOS 7:NSURLSession
2 字面理解Session会话控制
3 而Connection是连接,显然Session比这个Connection要更强大些
4
5 一、NSURLSession简介(整体认知)
6 (1).出现
7
8 NSURLConnection作为一个网络基础架构,它已经表现得相当好。它是伴随着2003年Safari浏览器的原始发行版本诞生的,但是,这些年来,iPhone和iPad新兴的用例,特别是有一些已经向NSURLConnection的几个核心设想提出了挑战,对其重构已经迫在眉睫。
9 在2013年的WWDC上,Apple揭开了NSURLConnection继任者的面纱:NSURLSession。
10 PS:苹果全球开发者大会,英文全称是(Apple Worldwide Developers Conference)。简称为“WWDC”。
11
12 (2).特点
13 NSURLSession与咱们熟悉的NSURLConnection是并列的。在程序在前台时,NSURLSession与NSURLConnection可以互为替代工作。注意,如果用户强制将程序关闭,NSURLSession会断掉。
14
15 (3).NSURLSession提供的功能:
16 1.通过URL将数据下载到内存
17 2.通过URL将数据下载到文件系统
18 3.将数据上传到指定URL
19 4.在后台完成上述功能
20
21 (4)NSURLSession带来了这些新的好处:
22 后台上传和下载
23 可以暂停和继续连接网络
24 保存配置
25 子类化和私有存储
26 改良的认证处理
27 丰富的代理模型
28 通过文件系统上传和下载
29
30 二、相关的类(组成部分)
31 1.NSURLConnection这个名字,实际上指的是一组构成Foundation框架中URL加载系统的相互关联的组件:NSURLRequest,NSURLResponse,NSURLProtocol,NSURLCache,NSHTTPCookieStorage,NSURLCredentialStorage,以及和它同名的NSURLConnection。
32
33
34 2.NSURLSession也是一组相互依赖的类,它的大部分组件和NSURLConnection中的组件相同如NSURLRequest,NSURLCache等。而NSURLSession的不同之处在于,它将NSURLConnection替换为NSURLSession和NSURLSessionConfiguration,以及3个NSURLSessionTask的子类:NSURLSessionDataTask, NSURLSessionUploadTask, 和NSURLSessionDownloadTask。
35
36 3.与NSURLConnection相比,NSURLSession最直接的改善就是提供了配置每个会话的缓存,协议,cookie和证书政策(credential policies),甚至跨应用程序共享它们的能力。这使得框架的网络基础架构和部分应用程序独立工作,而不会互相干扰。每一个NSURLSession对象都是根据一个NSURLSessionConfiguration初始化的,该NSURLSessionConfiguration指定了上面提到的政策,以及一系列为了提高移动设备性能而专门添加的新选项。
37 PS:cookie(小甜饼?)指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密),好让服务器用来辨认你的计算机(自动登录、用户习惯和关注等)。
38
39 4.NSURLSession的另一重要组成部分是会话任务,它负责处理数据的加载,以及客户端与服务器之间的文件和数据的上传下载服务。NSURLSessionTask与NSURLConnection是及其相似的,因为它负责加载数据,而主要的区别在于,任务共享它们父类NSURLSession的共同委托(common delegate)。
40
41
42
43 三、NSURLSession新推出的类(详细认知)
44 1.NSURLSessionConfiguration类
45 其中NSURLSessionConfiguration用于配置会话的属性,可以通过该类配置会话的工作模式
46 指定NSURLSession的配置信息。这些配置信息决定了NSURLSession的种类,HTTP的额外headers,请求的timeout时间,Cookie的接受策略等配置信息。更多的参见官方文档。
47
48 2.NSURLSession类
49 获取NSURLSession类对象有几种方式
50 会话是基于NSURLSession网络开发的核心组件。由上文的Configuration来配置,然后作为工厂,创建NSURLSessionTask来进行实际的数据传输任务。
51 3.NSURLSessionTask
52 实际的Session任务,分为三种
53 NSURLSessionTask是一个抽象类,它有三个具体的子类是可以直接使用的:NSURLSessionDataTask,NSURLSessionUploadTask和NSURLSessionDownloadTask。这三个类封装了现代应用程序的三个基本网络任务:获取数据,比如JSON或XML,以及上传下载文件。
54
55
56
57 四、工作流程
58 利用NSURLSession进行数据传输我们需要:
59 1.创建一个NSURLSessionConfiguration,用于第二步创建NSSession时设置工作模式和网络设置:
60
61 工作模式分为:
62 一般模式(default):工作模式类似于原来的NSURLConnection,可以使用缓存的Cache,Cookie,鉴权。
63 + (NSURLSessionConfiguration *)defaultSessionConfiguration
64 defaultSession,使用基于硬盘的持久话Cache,保存用户的证书到钥匙串,使用共享cookie存储
65
66 即时模式(ephemeral):不使用缓存的Cache,Cookie,鉴权。
67 + (NSURLSessionConfiguration *)ephemeralSessionConfiguration
68 配置信息和default大致相同。除了,不会把cache,证书,或者任何和Session相关的数据存储到硬盘,而是存储在内存中,生命周期和Session一致。比如浏览器无痕浏览等功能就可以基于这个来做。
69 后台模式(background):在后台完成上传下载,创建Configuration对象的时候需要给一个NSString的ID用于追踪完成工作的Session是哪一个(后面会讲到)。
70 + (NSURLSessionConfiguration *)backgroundSessionConfigurationWithIdentifier:(NSString *)identifier
71 创建一个可以在后台甚至APP已经关闭的时候仍然在传输数据的会话。注意,后台Session一定要在创建的时候赋予一个唯一的identifier,这样在APP下次运行的时候,能够根据identifier来进行相关的区分。如果用户关闭了APP,IOS 系统会关闭所有的background Session。而且,被用户强制关闭了以后,IOS系统不会主动唤醒APP,只有用户下次启动了APP,数据传输才会继续。
72
73 创建一个NSURLSession,系统提供了两个创建方法:
74
75 sessionWithConfiguration:
76 根据刚才创建的Configuration创建一个Session,系统默认创建一个新的OperationQueue处理Session的消息。
77 sessionWithConfiguration:delegate:delegateQueue:
78 可以设定回调的delegate(注意这个回调delegate会被强引用),并且可以设定delegate在哪个OperationQueue回调,如果我们将其设置为[NSOperationQueue mainQueue]就能在主线程进行回调非常的方便。
79
80
81 2.创建一个NSURLRequest调用刚才的NSURLSession对象提供的Task函数,创建一个NSURLSessionTask。
82
83 根据职能不同Task有三种子类:
84 NSURLSessionUploadTask:上传用的Task,传完以后不会再下载返回结果;
85 NSURLSessionDownloadTask:下载用的Task,下载内容到硬盘上;
86 NSURLSessionDataTask:可以上传内容,上传完成后再进行下载,存储为NSData格式。
87
88 得到的Task,调用resume开始工作。
89
90
91 3.如果是细粒度的Session调用,Session与Delegate会在指定的OperationQueue中进行交互。
92
93 4.当不再需要连接调用Session的invalidateAndCancel直接关闭,或者调用finishTasksAndInvalidate等待当前Task结束后关闭。这时Delegate会收到URLSession:didBecomeInvalidWithError:这个事件。Delegate收到这个事件之后会被解引用。
94
95 5.如果是一个BackgroundSession,在Task执行的时候,用户切到后台,Session会和ApplicationDelegate做交互。当程序切到后台后,在BackgroundSession中的Task还会继续下载。
96
97 五、详见代码
98
99
100
101 六、拓展了解部分
102
103 1.NSURLSession
104 会话是基于NSURLSession网络开发的核心组件。由上文的Configuration来配置,然后作为工厂,创建NSURLSessionTask来进行实际的数据传输任务。
105
106 2.NSURLRequest
107 指定请求的URL和cache策略。
108 通过NSURLRequest可以设置HTTPMethod,默认是GET
109
110 3.NSURLCache
111 cache URL请求返回的response。
112 //http://blog.sina.com.cn/s/blog_9693f61a01016t4w.html
113
114 4.NSURLResponse/NSHTTPURLResponse
115 通过REST API进行资源操作的时候,有request(请求)必然就有response(响应)。NSURLResponse中包含了metadata,例如返回的数据长度(expectedContentLength),MIME 类型,text编码方式。
116
117 5.NSURLCredential
118 - 用来处理证书信息
119 比如用户名密码,比如服务器授权等等。
120 这个要根据不同的认证方式来处理,
121 例如以下就是初始化一个用户名密码的认证。
122 //http://blog.csdn.net/majiakun1/article/details/17013379
123
124 6.NSURLAuthenticationChallenge
125 在访问资源的时候,可能服务器会返回需要授权(提供一个NSURLCredential对象)。那么,URLSession:task:didReceiveChallenge:completionHandler:被调用。需要的授权信息会保存在这个类的对象里。
126
127 7.NSURLProtectionSpace
128 这个类的对象代表了服务器上的一块需要授权信息的区域,英文叫realm。通过这个对象的信息来响应Challenge。
129 比如,如果服务器需要一个基于用户名密码的认证,那么应该先参考下NSURLProtectionSpace对象的host,port,realm,protocol等信息,然后依照这个信息提供证书。