AFNetworking断点续传

本文介绍如何利用AFNetworking实现文件的断点续传功能。通过检查已下载部分并设置请求头,确保能从断点处继续下载,同时自定义缓存管理策略,最终实现稳定可靠的断点续传。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

源码github地址:  https://github.com/lijun-wang/AFNetworkingResumeDownLoad

AFNetworking是支持断点续传

- (void)downLoadSomething

{

    NSURLRequest *request = [NSURLRequestrequestWithURL:[NSURL URLWithString:@"下载地址"]];

    NSString *fullPath=@"下载文件存储路径";

    

    AFHTTPSessionManager *manager = [AFHTTPSessionManagermanager];

    [manager.securityPolicysetAllowInvalidCertificates:YES];

    [manager.securityPolicysetValidatesDomainName:NO];

    NSURLSessionDownloadTask *task =

    [manager downloadTaskWithRequest:request

                            progress:^(NSProgress *_Nonnull downloadProgress) {

                                

                            }

                         destination:^NSURL *_Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {

                             return [NSURLfileURLWithPath:fullPath];

                         }

                   completionHandler:^(NSURLResponse *_Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {

                       

                   }];

    [task resume];  //开始

    [task suspend]; //暂停

}

但是这种续传方式的问题是程序如果在下载过程中被被杀死,那么是找不到原来的NSURLSessionDownloadTask的,也就是说这个是做不到真正的断点续传的,最主要的原因是下次我们找不到上次缓存的文件,要想实现无论何时都能续传还是要再找方法。其实这里我们也发现最大的阻力是要找到上次已经下载的缓存文件,研究过但是发现AFNetworking的缓存文件我们自己用不了,后来只有找方法自己缓存文件,方便下次自己用

- (void)breakpointResumeDownLoadSomething

{

    NSURLRequest *request = [NSURLRequestrequestWithURL:[NSURL URLWithString:@"下载地址"]];

    

    //检查文件是否已经下载了一部分

    unsigned long long downloadedBytes = 0;

    if ([[NSFileManagerdefaultManager] fileExistsAtPath:@"下载缓存路径"])

    {

        //获取已下载的文件长度

        downloadedBytes = 1;

        if (downloadedBytes > 0)

        {

            NSMutableURLRequest *mutableURLRequest = [requestmutableCopy];

            NSString *requestRange = [NSStringstringWithFormat:@"bytes=%llu-", downloadedBytes];

            [mutableURLRequest setValue:requestRangeforHTTPHeaderField:@"Range"];

            request = mutableURLRequest;

        }

        //不使用缓存,避免断点续传出现问题

        [[NSURLCachesharedURLCache] removeCachedResponseForRequest:request];

    }

    

    AFHTTPSessionManager *manager = [AFHTTPSessionManagermanager];

    [manager.securityPolicysetAllowInvalidCertificates:YES];

    [manager.securityPolicysetValidatesDomainName:NO];

    

    [manager  setDataTaskDidReceiveResponseBlock:^NSURLSessionResponseDisposition(NSURLSession *_Nonnull session, NSURLSessionDataTask *_Nonnull dataTask, NSURLResponse *_Nonnull response) {

        returnNSURLSessionResponseAllow;

    } ];

    

    //下载数据回调

    [manager setDataTaskDidReceiveDataBlock:^(NSURLSession *_Nonnull session, NSURLSessionDataTask *_Nonnull dataTask, NSData * _Nonnull data) {

        

        //存储回调的数据,自己维护一份缓存

        

        //将data写入指定的缓存路径,方便下次获取,这里写入推荐使用文件流NSFileHandle方式

        

        //NSProgress *downloadProgress=[manager downloadProgressForTask: dataTask];可以直接取到进度

        

    }];

    

    NSURLSessionDataTask *task =

    [manager dataTaskWithRequest:requestcompletionHandler:^(NSURLResponse *_Nonnull response, id  _Nullable responseObject, NSError *_Nullable error) {

        

    }];

    

    [task resume];

这样才真正实现了文件的缓存的获取,真正实现的随断随下                          

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值