NSURLSession官方文档(1)

来源:互联网 发布:录屏大师windows 编辑:程序博客网 时间:2024/06/03 19:01

今天整理资料发现以前翻译的官方文档,希望对大家有所帮助
NSURLSession的代理方法和API支持证书认证以及允许app在挂起或未运行的时候在后台执行下载任务

NSURLSession的APIs是异步执行的,如果不提供委托,NSURLSession对象使用系统提供的委托。 这样,您可以轻松地使用NSURLSession代替在NSURLSession上使用sendAsynchronousRequest:queue:completionHandler:convenience方法的现有代码。
如果使用系统默认的代理,开发者必须提供一个返回请求结果的block,来返回请求成功的数据或错误信息,此时有关response以及data传递的代理方法不会被调用(block代替自定义委托);如果你自己实现代理方法,当task对象收到服务器返回的数据后,用这些数据在调用代理方法

理解URL Session的概念
session的行为主要有以下三个方面决定:session的类型(session的类型是由configuration来决定)、task的类型、task创键时app是否在前台

1、session的类型,session的类型是由configuration来决定
session有三种类型,
Default sessions:默认session,他们在用户的钥匙串中使用持久的磁盘缓存和存储凭据。
Ephemeral sessions:暂时session,缓存、证书都存在RAM中,app释放session时,将RAM中相关数据清空
Background session:后台session,除了单独的进程处理所有数据传输,后台会话类似于默认会话。 后台会话有一些额外的限制Background Transfer Considerations。

2、task的类型:
Data Tasks:使用NSData对象发送和接受数据,Data Tasks常用于app和服务器之间的短暂的、交互式的数据请求,data task能一条一条的返回数据,也能通过Completion handler一次性返回所有数据。
Download Taskd:可以以文件的形式检索数据,并且支持app在未运行时的后台下载
Upload tasks:以文件的形式上传数据,并且支持app在未运行时的后台下载

3、后台传输的思考—iOS8以后才支持后台数据传输
后台上传和下载任务在网络出错后是自动有URL加载系统重试的,不需要检测失败的任务
只有session是被banckground session的configuretion对象创建才能支持后台下载,调用backgroundSessionConfiguration:来创建。因为后台数据的数据传输是单独另开辟的线程处理的、也因为重启app消耗很大,所以有一些限制,限制如下:

(1)session必须提供事件传递的委托。
(2)仅支持HTTP和HTTPs协议
(3)总是伴随着重定向
(4)仅支持从文件中上传,程序退出后从对象或流中上传的数据将失败,即不是后台上传

在iOS中,当后台传输完成或需要凭据时,如果您的应用程序不再运行,iOS会在后台自动重新启动您的应用程序,并调用应用程序的UIApplicationDelegate对象上的:handleEventsForBackgroundURLSession:completionHandler:方法。 此调用提供了使应用程序启动的会话的标识符。
(1)我们应该存储完成处理程序completionHandler,并且使用handleEventsForBackgroundURLSession:提供的会后标志创建一个后台配置对象,并使用该配置对象创建新的session。 新会话将自动与正在进行的后台活动重新关联。
(2)当会话完成最后一次后台下载任务时,它调用URLSessionDidFinishEventsForBackgroundURLSession:消息。 在该委托方法中,调用之前在主线程上存储的完成处理程序completionHandler,以便操作系统知道可以再次挂起您的应用程序是安全的。

(3)当用户重新启动应用程序时,应用程序应立即创建与应用程序上次运行时所有未完成任务相同的标识符的后台配置对象,然后为每个配置对象创建一个会话。 这些新会话类似地与正在进行的后台活动自动重新关联。

在app挂起期间,任何任务完成后,delegate会使用task和URL关联一个新的下载文件来调用URLSession:downloadTask:didFinishDownloadingToURL:
相似的,如果任何任务要求认证,NSURLSession对象调用代理的URLSession:task:didReceiveChallenge:completionHandler:或者URLSession:didReceiveChallenge:completionHandler:方法

4、session的生命周期和代理的交互
根据您对NSURLSession类所做的工作,帮助我们完全理解session的生命周期,包括会话如何与其委托进行交互,委托调用的顺序,服务器返回重定向时会发生什么, 当您的应用程序恢复失败的下载时会发生什么,等等。

有关URL会话生命周期的完整描述,请参阅URL会话的生命周期。

5、使用session的代理方法
(1)使用session的代理,遵守NSURLSession的相关代理方法

@import Foundation;typedef void (^CompletionHandler)();@interface MySessionDelegate : NSObject <NSURLSessionDelegate, NSURLSessionTaskDelegate, NSURLSessionDataDelegate, NSURLSessionDownloadDelegate, NSURLSessionStreamDelegate>@property NSMutableDictionary <NSString *, CompletionHandler>*completionHandlers;@end

(2)创建并且配置session
因为大多数配置包含在configuration对象中,使用configuration创建session对象,可以重用configuration对象创键附加的sessions(不能重用后台session的configuration),实例化时,可以指定以下内容:
—-指定一个管理该会话的行为及其中的任务的configuration
—-(可选)代理对象用于在接收到数据时处理传入数据,并且处理特定于会话和其中的任务的其他事件,诸如服务器认证,确定资源加载请求是否应当被转换为下载等等

初始化session后,你不能使用新的session改变configuration或者代理

// 创建configurationNSURLSessionConfiguration *defaultConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];NSURLSessionConfiguration *ephemeralConfiguration = [NSURLSessionConfiguration ephemeralSessionConfiguration];NSURLSessionConfiguration *backgroundConfiguration = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier: @"com.myapp.networking.background"];//为default session配置cache,iOS的缓存使用~/Library/Caches 目录NSString *cachesDirectory = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;NSString *cachePath = [cachesDirectory stringByAppendingPathComponent:@"MyCache"];NSURLCache *cache = [[NSURLCache alloc] initWithMemoryCapacity:16384 diskCapacity:268435456 diskPath:cachePath];defaultConfiguration.URLCache = cache;defaultConfiguration.requestCachePolicy = NSURLRequestUseProtocolCachePolicy;// 创建sessionid <NSURLSessionDelegate> delegate = [[MySessionDelegate alloc] init];NSOperationQueue *operationQueue = [NSOperationQueue mainQueue];NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration:defaultConfiguration delegate:delegate operationQueue:operationQueue];NSURLSession *ephemeralSession = [NSURLSession sessionWithConfiguration:ephemeralConfiguration delegate:delegate delegateQueue:operationQueue];NSURLSession *backgroundSession = [NSURLSession sessionWithConfiguration:backgroundConfiguration delegate:delegate delegateQueue:operationQueue];

(3)使用系统提供的代理completionHandler:来获取资源
大多使用NSURLSession是使用系统的代理请求一个资源,就是普通的数据任务
—创键configuration并且使用configuration创建session
—在获取全部数据后,对其进行处理

NSURLSession *sessionWithoutADelegate = [NSURLSession sessionWithConfiguration:defaultConfiguration];NSURL *url = [NSURL URLWithString:@"https://www.example.com/"];[[sessionWithoutADelegate dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {    NSLog(@"Got response %@ with error %@.\n", response, error);    NSLog(@"DATA:\n%@\nEND DATA\n", [[NSString alloc] initWithData:data  encoding:NSUTF8StringEncoding];}] resume];

(4)使用自定义代理获取数据,可以满足一般的数据请求
使用自定义代理,必须使用下列方法
—URLSession:dataTask:didReceiveData:从url中获取数据,如果使用数据的话应该在这个方法中存储数据;可以将任务对象映射到NSMutableData对象以存储到字典,然后对该对象使用appendData:方法来追加新接收的数据。(NSURLSessionDataDelegate的方法)
—URLSession:task:didCompleteWithError:指明自己定制的任务是否获取了全部的数据(NSURLSessionTaskDelegate方法)

0 0
原创粉丝点击