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

iOS-大文件下载、断点续传实现

2019-03-25 10:45 162 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/samuelandkevin/article/details/88787798

请求头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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: