最近在做一个类似网盘的项目,需要实现文件的上传和下载。
我自己用NSURLSession封装了一个下载工具类来使用,但是遇到了无法断点下载的问题。我们先来看看NSURLSession的暂停方法。
[task cancelByProducingResumeData:^(NSData * _Nullable resumeData) {
self.suspendBlock = suspend;
if (suspend) {
self.suspendBlock(resumeData);
}
}];
NSURLSession是利用NSURLSessionDownloadTask 来调用一个暂停方法,这个方法会返回一个data数据,这个数据包含了文件已下载部分的信息,我们在断点续传的时候只需要利用这个data就可以了。
NSURLSessionDownloadTask *task = [self.session downloadTaskWithResumeData:resumeData];
[task resume];
我发现在我执行暂停的时候拿到的这个data是空的,这就是无法断点续传的原因,那么为什么是空的呢? 我查阅了苹果的官方文档
官方文档里表示必须要满足这些条件才能实现断点续传下载,问题最可能出现在第三条。 果然,我拿到的服务器响应头里并没有这两个参数
所以我猜想,NSURLSession应该是利用Etag或Last-modified来记录已下载的进度来实现断点续传。
最后,让服务器在响应头里加上这两个参数,问题完美解决。