标签:
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等信息,然后依照这个信息提供证书。
标签:
原文地址:http://www.cnblogs.com/sdutmyj/p/4774102.html