您的位置:首页 > 移动开发 > IOS开发

关于NSURLSession在下载失败后的断点续传

2017-01-21 22:18 141 查看
关于NSURLSession下载文件时的断点续传,网上相关文章有很多,但都是主动暂停下载任务时断点续传的方法,没有提到过下载失败的情况,其实很简单,代码如下:

在下载出错的错误回调中

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didCompleteWithError:(nullable NSError *)error


使用如下代码获得用来做恢复的NSData

NSData* resumeData = error.userInfo[NSURLSessionDownloadTaskResumeData];


再在下次任务开始时使用如下代码做恢复即可

NSURLSessionConfiguration * config = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
NSURLSessionDownloadTask *task = [session downloadTaskWithResumeData:resumeData];
[task resume]


顺带着也贴下主动暂停时,获得用来做恢复NSData的代码

- (void)cancelDownload
{
__weak typeof(self) wSelf = self;
[_task cancelByProducingResumeData:^(NSData * _Nullable resumeData) {
//storage resumeData
}];
}


另外NSURLSession是否可以断点续传,有如下一些限制

The response must contain an ETag or Last-Modified header.
I think the response must also contain an Accept-Ranges: bytes header
The temporary file must still exist (not low on disk space).
It must be an HTTP or HTTPS request.
The Last-Modified or ETag header must indicate that the file hasn't changed since it was last requested.

翻一下
1. Server的response header中必须包含ETag或Last-Modified字段
2. Server的response header必须包含Accept-Ranges字段
3. 曾经下载过的临时文件需要保留
4. 必须是HTTP或者HTTPS请求
5. 临时文件需要匹配Last-Modified或ETag字段
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息