断点续传的实现思路
1、每次一进来,先给总大小和已经下载的大小赋值,判断若不是从头下载,则显示进度条
2、暂停的时候,取消请求,并用 NSUserDefaults记录下载的暂停位置(客户端记录)
3、继续下载的时候,设置下载的起始位置
http协议的请求头的设置:
Range : bytes=0-499 表示头500个字节
Range : bytes=500-999 表示第二个500字节
Range : bytes=-500 表示最后500个字节
Range : bytes=500- 表示500字节以后的范围
Range : bytes=0-0,-1 第一个和最后一个字节
4、续传写文件时,总是从文件末尾追加写文件
效果图

代码实现
—————————viewDidLoad方法
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
recevieTotal = [[userDefaults objectForKey:@"RecevieTotal"] floatValue];
total = [[userDefaults objectForKey:@"Total"] floatValue];
if (total > 0) {
CGFloat progress = recevieTotal / total;
_progressView.progress = progress;
_progressLabel.text = [NSString stringWithFormat:@"%.2f%%", progress * 100];
}
—————————downLoad方法
if (!isDownload) {
NSURL *url = [NSURL URLWithString:@"http://free2.macx.cn:8182/tools/other4/iStatMenus511b17.dmg"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
if (recevieTotal > 0) {
NSString *value = [NSString stringWithFormat:@"bytes=%d-", (int)recevieTotal];
[request setValue:value forHTTPHeaderField:@"Range"];
}
_connection = [NSURLConnection connectionWithRequest:request delegate:self];
isDownload = YES;
NSString *urlStr = url.absoluteString;
NSString *fileName = [urlStr lastPathComponent];
_filePath = [NSHomeDirectory() stringByAppendingFormat:@"/Documents/%@", fileName];
if (![[NSFileManager defaultManager] fileExistsAtPath:_filePath]) {
[[NSFileManager defaultManager] createFileAtPath:_filePath contents:nil attributes:nil];
}
}
—————————pause方法
[_connection cancel];
_connection = nil;
[self appendFileData:self.receiveData];
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:@(recevieTotal) forKey:@"RecevieTotal"];
[userDefaults setObject:@(total) forKey:@"Total"];
[userDefaults synchronize];
isDownload = NO;
—————————接收响应的方法---- NSHTTPURLResponse响应
self.receiveData = [[NSMutableData alloc] init];
if (total == 0) {
total = [[response.allHeaderFields objectForKey:@"Content-Length"] floatValue];
NSLog(@"total is %.2f", total);
}
—————————接收数据的方法----实时接收
[self.receiveData appendData:data];
recevieTotal += data.length;
double progress = recevieTotal / total;
self.progressView.progress = progress;
self.progressLabel.text = [NSString stringWithFormat:@"%.2f%%", progress * 100];
if (self.receiveData.length > 500 * 1000) {
[self appendFileData:self.receiveData];
[self.receiveData setData:nil];
}
—————————接收完数据的方法
if (self.receiveData.length < 500 * 1000) {
[self appendFileData:self.receiveData];
[self.receiveData setData:nil];
}
_progressLabel.text = @"下载完成";
isDownload = NO;
- (void)appendFileData:(NSData *)data
{
if (data.length == 0) {
return;
}
//使用NSFileHandle写文件,此文件必须已经创建,NSFileHangdle不会创建文件
NSFileHandle *fileHandle = [NSFileHandle fileHandleForWritingAtPath:_filePath];
//将数据插入到写入点
[fileHandle seekToEndOfFile];
[fileHandle writeData:data];
//关闭文件,确保写入完成
[fileHandle closeFile];
}