请求头Range
实现断点续传要了解HTTP请求头Range,通过设置Range可以指定每次从网络下载数据包的大小
Range大小设置
bytes=0-499 ,从0到499的头500个字节
bytes=500-999,从500到999的第二个500字节
bytes=500- ,从500字节以后的所有字节
bytes=-500, 最后500个字节
bytes=500-599,800-899 同时指定几个范围
用原生API请求
NSURL *url = [NSURL URLWithString:@""];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
NSString *range = [NSString stringWithFormat:@"bytes=%lld-", self.currentLength];
[request setValue:range forHTTPHeaderFiled:@"Range"];
实现方式
(1)NSURLConnection
(2)NSURLSession(iOS7 新出)
NSURLSession有三种任务类型:
NSURLSessionDataTask : 普通的GET\POST请求
NSURLSessionDownloadTask : 文件下载
NSURLSessionUploadTask : 文件上传
注意
NSURLSessionDownloadTask* downloadTask = [session downloadTaskWithURL:url completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
}];
location就是下载好的文件写入沙盒的地址(iOS沙盒文件夹(Documents,Library,tmp))
下载完成之后会自动删除temp中的文件,开发者需要在回调中把文件移动或者复制到指定目录下
缺点就是无法监听下载进度
要监听下载进度,NSURLSessionDownloadDelegate
NSURLSessionDownloadDelegate的三个方法
功能:遵守NSURLSessionDownloadDelegate可以监听下载的进度值
(1)didFinishDownloadingToURL 下载完毕会调用
(2)didWriteData:totalBytesWritten:totalBytesExpectedToWrite: (这次写入的大小:已经写入沙盒的大小:文件总大小)
(3)didResumeAtOffset:expectedTotalBytes (恢复下载后调用)
恢复下载api
downloadTaskWithResumeData: (恢复下载)
开发遇到问题:
接收文件的NSMutableData一直内存,随着文件的下载一直变大.
解决:
NSFileHandle,对文件读取,写入,更新.
移动到文件的最后面: seekToEndFile
将数据写入沙盒: writeData
累计写入文件的长度: self.currentLength += data.length
加载完毕调用: closeFile