iOS如何实现文件下载-创新互联

这篇文章给大家分享的是有关iOS如何实现文件下载的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名注册网站空间、营销软件、网站建设、淮安网站维护、网站推广。
  • 原生态的分段下载的基本原理

文件下载往往需要比较长的一段时间,实现分段下载是实现断点下载的前提

实现分段下载需要解决以下两个问题

    问题1:下载前,需要知道文件的长度

    问题2:每一次请求下载文件的一段

  • 针对问题1:HEAD请求获取文件长度

HEAD请求只获取响报文,而不获取资源的实际数据

     通常用来获取文件长度、检测服务器端资源是否发生变化

响应对象NSURLResponse的属性exceptedContentLength即表示文件的长度


   iOS如何实现文件下载

  • 针对问题2:请求头参数Range进行分段下载

HTTP协议规定,请求头中的Range参数用于请求一段数据

如:

   bytes=0-499            从0到499的头500个字节

     bytes=500-999          从500到999的第二个500字节

     bytes=500-             从500字节以后的所有字节

     bytes=-500               最后500个字节

     bytes=500-599,800-899  同时指定几个范围

也就是说,分段下载,就是发送多次多次请求,每次请求设置Range字段

下面的代码,完成一个文件的分段下载:

   iOS如何实现文件下载

下面的代码,完成文件的一段下载:

   iOS如何实现文件下载

使用异步下载时,应使用代理、通知、block进行下载后的处理动作。

  • NSURLSession的下载任务

下载任务的创建:

- (NSURLSessionDownloadTask *)downloadTaskWithURL:(NSURL*)url
- (NSURLSessionDownloadTask *)downloadTaskWithURL:(NSURL*)url completionHandler:(void (^)(NSURL *location, NSURLResponse *response, NSError *error))completionHandler
- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request
- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURL*location, NSURLResponse *response, NSError*error))completionHandler

NSURLSession执行下载任务相关的代理方法:

// 周期性的调用,参数描述了下载的进度
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask*)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
// 下载完成时调用
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask*)downloadTask didFinishDownloadingToURL:(NSURL *)location

示例说明:

1)创建NSURLSession对象并指定代理

    iOS如何实现文件下载

2)创建下载任务并启动

    iOS如何实现文件下载

3)实现下载完成的代理方法:应将下载完成后的文件移动到指定目录并重命名


    iOS如何实现文件下载

4)实现下载进度监听的代理方法:


    iOS如何实现文件下载

  • 下载暂停/继续的实现

NSURLSessionDownloadTask的暂停方法:

- (void)cancelByProducingResumeData:(void (^)(NSData *resumeData))completionHandler

   参数resumeData:描述断点信息

NSURLSession通过断点信息创建下载任务:

- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData
- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeDatacompletionHandler:(void (^)(NSURL *location, NSURLResponse *response, NSError*error))completionHandler

相关代理方法:

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask*)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes

实例说明:

1)下载暂停

    iOS如何实现文件下载

2)下载继续

    iOS如何实现文件下载

3)断点继续下载的代理方法

    iOS如何实现文件下载

  • 使用AFNetworking下载


使用AFNetworking进行下载,本质上还是创建NSURLSessionDownloadTask对象

   只是将代理方法的封装到AFURLSession对象中,并用block指定行为

AFURLSessionManager创建下载任务

// 根据请求对象创建下载任务
- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request progress:(NSProgress *__nullable __autoreleasing *__nullable)progress destination:(nullable NSURL *( ^ ) ( NSURL *targetPath , NSURLResponse *response ))destination completionHandler:(nullable void ( ^ ) ( NSURLResponse *response , NSURL *filePath , NSError *error ))completionHandler
// 根据断点信息创建爱下载任务
- (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData progress:(NSProgress *__nullable __autoreleasing *__nullable)progress destination:(nullable NSURL *( ^ ) ( NSURL *targetPath , NSURLResponse *response ))destination completionHandler:(nullable void ( ^ ) ( NSURLResponse *response , NSURL *filePath , NSError *error ))completionHandler

   参数destination:该block用于指定获取文件下载后的路径

   参数completionHandler:该block在下载任务完成时执行

          包括任务被暂停时(cancelByProducingResumeData)

   出参progress:非NULL时,会返回一个NSProgress对象,描述下载进度

示例说明:

1)创建NSURLSession对象并指定代理

    iOS如何实现文件下载

2)下载完成的block封装1:应返回下载完成的文件的最终存储URL

    iOS如何实现文件下载

3)任务完成block封装:包括错误情况下的处理、成功请求下的提示等

    iOS如何实现文件下载

4)下载任务的创建启动/继续

    iOS如何实现文件下载

5)下载任务的暂停

    iOS如何实现文件下载

  • 使用NSProgress监听下载进度

在上面的代码中,有一个参数NSProgress类型,传的是NULL,这个参数是AFN框架用于监听下载进度

NSProgress在iOS7.0引入,使用观察者模式

     其fractionCompleted属性值变化时,通知其所有的观察者

示例说明:

1)下载任务的创建启动/继续

    iOS如何实现文件下载

2)KVO的响应方法

    iOS如何实现文件下载

    其中self.progressView是一个自定义的用于显示下载进度的视图对象



  • 下载任务常遇状况


状况一:程序退出时,如何保存下载状态

   下载任务管理类,注册成为以下UIApplication对象通知的响应者

      UIApplicationDidEnterBackgroundNotification

      UIApplicationWillTerminateNotification

   响应方法实现:将所有的下载任务暂停,并将断点信息保存到本地的操作

   响应下面通知,从本地读出断点信息的操作

      UIApplicationWillEnterForegroundNotification

   或在下载任务管理对象被创建时,从本地读出断点信息的操作

状况二:从断点继续下载时,如果服务器上的文件发生变化或被删除,应如何处理?

   可以在从断点继续下载前,先发送一次HEAD请求,判断文件是否存在,以及该文件的长度是否发生变化等操作。

感谢各位的阅读!关于“iOS如何实现文件下载”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。

分享文章:iOS如何实现文件下载-创新互联
文章来源:https://www.cdcxhl.com/article32/ddggsc.html

成都网站建设公司_创新互联,为您提供移动网站建设面包屑导航服务器托管外贸建站电子商务网站制作

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

网站建设网站维护公司