1.NSURLSessionDownloadTask执行下载操作的时候,服务器需要在响应头中添加Content-Length字段,否则无法通过代理或者block获取下载进度
2.NSURLSessionDownloadTask执行下载任务的时候,在任务下载完成前,会在app的沙盒的tmp文件夹中生成一个.tmp文件,这个就是已经下载的文件的临时文件,在下载完成后会被删除。
3.使用NSURLSessionDownloadTask执行断点续传的方式有两种:
3.1 直接使用系统的方法(- (void)suspend ->暂停,- (void)resume ->继续),这种方式简单,实用,更多的操作是NSURLSessionDownloadTask帮你实现了,缺点就是暂停的时候没办法获取到下载的进度等信息,没办法本地化下载的信息,这样的话就没办法在app被杀进程的时候保存下载信息,进而导致无法在再次启动的时候继续之前的下载
3.2 使用cancelByProducingResumeData:实现暂停(其实这个本质上是取消了下载的任务,你可以在执行这个操作的时候看看下载任务的状态,已经变成NSURLSessionTaskStateCompleted了),那么怎么继续下载呢?当然不能使用- (void)resume,使用- (void)resume的话就等于又从头开始下载了,这个时候就需要cancelByProducingResumeData:中得参数resumeData了,你可以把resumeData转化为字符串,你可以看到是一个xml文件,里面包含下载的临时文件的文件名、路径、下载进度等信息,还有一些看不懂的信息如下:
再次启动下载的时候就需要利用resumeData启动一个下载任务,继续之前的下载,这种方式的优点就是可以实现app在被杀进程的时候本地化包含下载进度等信息的resumeData,然后再次启动的时候继续之前下载,当然缺点也是很容易看到了:比较麻烦,代码比第一种方式多(这里还有一个问题就是不是所有利用cancelByProducingResumeData:暂停都能获取到resumeData,resumeData有可能是nil,我这边就有这样的问题,但是使用网上找来的下载地址是可以的,大概跟服务器的配置有关系,这也算是一个缺点吧)。
未完待续。。。。。