NSURLConnection 中的恢复下载功能

作者:编程家 分类: ios 时间:2025-11-14

NSURLConnection 中的恢复下载功能

NSURLConnection 是 iOS 开发中常用的网络请求类,可以用于发送 HTTP 请求并接收响应数据。其中,NSURLConnection 提供了恢复下载功能,允许用户在网络中断或应用程序退出后,能够继续下载未完成的文件,提高用户体验。本文将介绍如何使用 NSURLConnection 实现恢复下载功能,并给出一个案例代码。

首先,我们需要了解 NSURLConnection 中恢复下载功能的原理。当我们通过 NSURLConnection 发起一个文件下载请求时,服务器会返回一个 HTTP 响应头,其中包含了文件的大小、文件的名称等信息。在下载过程中,NSURLConnection 会将已下载的数据写入一个临时文件中,并通过代理方法将下载进度回调给开发者。当下载中断或应用程序退出时,我们可以通过保存已下载的数据的长度,再次发起请求时设置 HTTP 请求头的 "Range" 字段,告诉服务器我们要从哪个位置继续下载。

案例代码:

objc

// 在 ViewController.m 文件中,添加以下代码

#import "ViewController.h"

@interface ViewController ()

@property (nonatomic, strong) NSURLConnection *connection;

@property (nonatomic, strong) NSMutableData *responseData;

@property (nonatomic, assign) long long totalLength;

@property (nonatomic, assign) long long currentLength;

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

// 创建 NSURLRequest 对象

NSURL *url = [NSURL URLWithString:@"http://example.com/file.zip"];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

// 设置请求头的 Range 字段,用于恢复下载

NSString *range = [NSString stringWithFormat:@"bytes=%lld-", self.currentLength];

[request setValue:range forHTTPHeaderField:@"Range"];

// 发起网络请求

self.connection = [NSURLConnection connectionWithRequest:request delegate:self];

}

#pragma mark - NSURLConnectionDelegate

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {

// 获取文件总长度

self.totalLength = response.expectedContentLength;

// 创建 NSMutableData 对象,用于保存已下载的数据

self.responseData = [NSMutableData data];

}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {

// 将下载的数据追加到 responseData 中

[self.responseData appendData:data];

// 计算已下载的数据长度

self.currentLength += data.length;

// 更新下载进度

float progress = (float)self.currentLength / self.totalLength;

NSLog(@"下载进度:%.2f%", progress * 100);

}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {

// 下载完成后,保存文件到本地

NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];

filePath = [filePath stringByAppendingPathComponent:@"file.zip"];

[self.responseData writeToFile:filePath atomically:YES];

NSLog(@"文件下载完成,保存路径:%@", filePath);

}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {

NSLog(@"文件下载失败,错误信息:%@", error.localizedDescription);

}

@end

使用 NSURLConnection 实现文件恢复下载的步骤:

1. 创建 NSURLRequest 对象,并设置请求 URL。

2. 设置请求头的 "Range" 字段,指定从哪个位置继续下载。

3. 通过 NSURLConnection 发起网络请求,并设置代理对象为当前 ViewController。

4. 在代理方法中,获取文件总长度,并创建一个 NSMutableData 对象用于保存已下载的数据。

5. 在代理方法中,将下载的数据追加到 responseData 中,并更新已下载的数据长度和下载进度。

6. 在下载完成的代理方法中,将 responseData 保存到本地文件中。

7. 在下载失败的代理方法中,处理下载失败的情况。

通过以上步骤,我们可以使用 NSURLConnection 实现文件的恢复下载功能。这对于大文件的下载以及网络不稳定的情况下,能够提供更好的用户体验。