使用步骤:
NSURLSession对象创建Task,然后执行Task
Task:
NSURLSessionTask:抽象类。
NSURLSessionDataTask:都能
NSURLSessionUploadTask:上传
NSURLSessionDownloadTask:下载 大文件
需要手动resume恢复任务。
下载文件:
根据NSURLSession获取到单例,单例根据URL获取到NSURLSessionDownloadTask实例任务,启动任务resume。
在这个实例的block回调中根据下载的文件位置,使用NSFileManager将文件剪切到对应的文件夹。
代理的方式:
能监听下载进度。
1、需要在创建NSURLSession时设置代理。
2、遵守NSURLSessionDataDelegate协议。
3、当接收到服务器响应时,需要调用block的completionHandler(NSURLSessionResponseAllow);(设置允许处理服务器的响应,才会继续接收服务器返回的数据)
4、然后执行接收到服务器的数据方法
5、最后调用执行完毕的方法(不管执行成功或者失败)
大文件下载:
1、NSURLSessionDownloadTask+NSURLSession的代理方式(注意下载文件位置,想下载对应的位置需要将文件剪切)
2、NSURLSessionDataTask+NSURLSession的代理方式(文件路径可以自己直接设置)
代理的方式能监听下载进度,不会将数据写入缓存,所以适合大文件,而block的方式将数据写入缓存,不适合大文件下载
文件暂停和恢复:
resume方法和suspend方法能直接恢复和暂停。
缺点:程序退出后再开启程序不能接着下载
解决:
1、通过NSURLSessionDownloadTask任务的cancelByProducingResumeData:^(NSData *resumeData){}取消任务。将resumeData写入沙盒中。
2、将文件的位置保存到plist文件中。(解决多个文件)
3、下次打开时看沙盒中有没有plist文件,有就读取这个文件,通过dowloadTaskWithResumeData:这个方法飞将resumeData传给服务器。
(resumeData记录着上次和服务器的交互信息,直接将这个传给服务器,服务器就知道从哪里开始下载。)
注意:
cancelByProducingResumeData:取消任务是不能恢复的,只能重新创建任务。
断点下载原理:
通过设置请求头的Range的方式就能实现。
resumeData已经包含了,也就是NSURLSession已经实现了。
而NSURLConnection需要手动设置:[[NSMutableURLRequest requestWithURL:nil]setValue:@"0-" forHTTPHeaderField:@"Range"]
如果下载中途失败:
能在失败的error中获取到resumeData。error.userInfo[NSURLSessionDownloadTaskResumeData]。
程序下载中途用户退出或程序崩溃
方法一:可以在- (void)applicationWillTerminate:(UIApplication *)application{}
方法中将调用cancelByProducingResumeData:方法(不靠谱)
方法二:启动程序后获取到已经下载的文件的大小,再发送网络请求时,使用NSURLSeesion的dataTaskWithRequest:来设置请求体。
注意:
不用downloadTask的原因:下载的数据是下载在tmp中,会随时删除。
沙盒目录:
Documents:应用中用户数据可以放在这里,iTunes备份和恢复的时候会包括此目录
tmp:存放临时文件,iTunes不会备份和恢复此目录,此目录下文件可能会在应用退出后删除
Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除
防止重复下载
当下载的长度等于服务器响应的长度时说明下载过了。
获取下载过的文件的长度
[[[NSFileManager defaultManager] attributesOfItemAtPath:XMGFileFullpath error:nil][NSFileSize] integerValue]
文件的名字的保存方式
根据文件名的MD5和文件的总长度生成一个字典。
下载过了
当下载的长度等于保存在字典中的长度时说明下载完毕了。
注意:下载0和保存0的情况。
下载进度
用已经下载的除以总长度,建议封装成单例,供多个界面共享进度。
文件上传:
uploadTaskWithRequest:fromFile:方法
直接能将文件上传到服务器,但是这样不安全,这里使用的是PUT请求(需要服务器支持)。
所以如果想要使用pust请求还是需要拼接请求体。
设置请求超时:
timeoutIntervalForRequest能统一设置所有请求的超时时间。
设置蜂窝网络
allowsCellularAccess
https
通过代理NSURLSessionTaskDelegate来处理证书。
但是通过AFN内部已经处理好了。
获得共享的Session
+(NSURLSession*)sharedSession;
自定义Session
+(NSURLSession*)sessionWithConfiguration: (NSURLSessionConfiguration*)configuration delegate:(id<NSURLSessionDelegate>)delegatedelegateQueue:(NSOperationQueue*)queue;
常用方法
-(void)suspend;// 暂停
-(void)resume;// 恢复
-(void)cancel;// 取消
@property(readonly,copy)NSError*error; //错误
@property(readonly,copy)NSURLResponse*response; //响应
-(void)cancelByProducingResumeData:(void(^)(NSData*resumeData))completionHandler;// 取消任务
网友评论