上一篇好像过去好久了。。
最近得闲把上篇的下载器写完了,这里简单介绍下
项目地址
实际上是对NSURLSession的一层包装
1.管理者VWChaplin拥有一个session
2.session创建出的task被管理者产出的下载任务VWChaplinSmile关联
对断点续传的支持,API层的"继续"功能
1.NSURLSessionDownloadTask支持一定的断点续传功能,取消时该任务时会提供用于下次继续的数据resumeData
支持的条件如下:
A download can be resumed only if the following conditions are met:
The resource has not changed since you first requested it
The task is an HTTP or HTTPS GET request
The server provides either the ETag or Last-Modified header (or both) in its response
The server supports byte-range requests
The temporary file hasn’t been deleted by the system in response to disk space pressure
2.主动发起的带有range参数的请求
在任务内通过记录总共的任务量和已完成的任务量,能够得到下次请求的range
3.持久化下载任务
对于app无法继续正常运行时,保留现场,将下载任务和下载文件进行存储
文件相关:
1.一次完整的请求
在下载时使用的NSURLSessionTask是NSURLSessionDownloadTask,获取文件的代理方法为:
-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
方法说明是代理返回后文件将被删除,因此任务完成后需要主动移动文件到能控制的区域
2.多次继续的请求,获取每次中断请求时已下载文件
每次任务的暂停实际上是进行了取消任务的操作,任务取消是不会执行 说明1)内 的代理方法,那去哪里获取刚刚下载的文件?
线索:任务取消后,既然NSURLSessionDownloadTask能提供resumeData来继续下载,那这次task的下载数据一定是能够获取到的。
观察resumeData:存储resmueData后可以看到resumeData内是一个xml格式的存档,以key-value形式存储的相关信息,可以找到的key如下:
NSURLSessionDownloadURL
NSURLSessionResumeBytesReceived
NSURLSessionResumeCurrentRequest
NSURLSessionResumeEntityTag
NSURLSessionResumeInfoTempFileName
NSURLSessionResumeInfoVersion
NSURLSessionResumeOriginalRequest
根据filename可以从tmp目录下获取到本次下载的文件
3.任务碎片的合并
创建config文件记录了下载的完整流程中产生的所有文件(每次暂停即存储该次产生的文件)
以此合并文件即可
4.文件结构:
Main
=>Tasks=>config+fragments
=>History
=>TaskWrapper Persistence=>config
有待完善:
1.保留现场的时机
2.session与管理者的自定义配置