iOS网络开发(8)文件下载的实现

本篇文章介绍文件下载,包括以下内容:

  1. 原生态的分段下载的基本原理
  2. NSURLSession的下载任务
  3. 使用AFNetworking下载
  4. 下载任务常遇状况
  • 原生态的分段下载的基本原理

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

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

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

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

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

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

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

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

  • 针对问题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字段

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

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

使用异步下载时,应使用代理、通知、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对象并指定代理

2)创建下载任务并启动

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

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

  • 下载暂停/继续的实现

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)下载暂停

2)下载继续

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

  • 使用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对象并指定代理

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

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

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

5)下载任务的暂停

  • 使用NSProgress监听下载进度

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

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

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

示例说明:

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

2)KVO的响应方法

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

  • 下载任务常遇状况

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

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

UIApplicationDidEnterBackgroundNotification

UIApplicationWillTerminateNotification

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

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

UIApplicationWillEnterForegroundNotification

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

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

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

时间: 2024-10-24 09:36:18

iOS网络开发(8)文件下载的实现的相关文章

IOS网络开发NSURLSession详解(一)概述

原创blog,转载请注明出处blog.csdn.net/hello_hwc 我的IOS-SDK详解专栏,欢迎关注 http://blog.csdn.net/column/details/huangwenchen-ios-sdk.html 前言: 这个IOS网络编程的系列计划6篇文章,NSURLSession3篇(一篇概述,一篇详细阐述三种task和delegate的使用,一篇阐述授权,证书等内容),网络的基础知识两篇(一篇REST API讲解已经写完了,一篇我会把写博客的过程中遇到的概念总结出来

IOS网络开发概述

概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力的.今天就会给大家介绍这部分内容: Web请求和响应 使用代理方法 简化请求方法 图片缓存 扩展--文件分段下载 扩展--文件上传 NSURLSession 数据请求 文件上传 文件下载 会话 UIWebView 浏览器实现 UIWebView与页面交互 网络状态 目 录 Web请求和响应 使用代理

ios网络开发

概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力的.今天就会给大家介绍这部分内容: Web请求和响应 使用代理方法 简化请求方法 图片缓存 扩展--文件分段下载 扩展--文件上传 NSURLSession 数据请求 文件上传 文件下载 会话 UIWebView 浏览器实现 UIWebView与页面交互 网络状态 目 录 Web请求和响应 使用代理

iOS网络开发(1)写代码前需要了解的

从本篇文章开始,介绍一些网络开发中用到的技术. iOS的网络开发中,特别是应用开发,使用Http协议作为主要的通信手段 写代码前,先了解一些与协议相关联的内容,包括: URL的概念 HTTP与HTTPS HTTP请求的内容及请求对象 HTTP应答的内容及请求对象 URL URL:统一资源标示符,可以表示一个资源的路径,这个路径可以是本地的.网络上的. URL是对可以从互联网上得到的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址. 互联网上每一个文件都有唯一一个URL,它包含的信息指出文

IOS网络开发实战(二)

1 飞机航班查询软件 1.1 问题 NSURLConnection是IOS提供的用于处理Http协议的网络请求的类,可以实现同步请求也可以实现异步请求,本案例使用NSURLConnection类实现一个飞机航班查询的工具软件,采用GET的同步请求方式访问网络数据,如图-1所示: 图-1 1.2 方案 首先创建一个SingleViewApplication应用,在Storyboard文件中搭建查询界面,上方的三个Textfield控件分别用于接受用户输入的出发城市.到达城市和触发日期,界面中间有一

IOS 网络开发NSURLSession(四)UploadTask(上传数据+图片)

原创blog,转载请注明出处 blog.csdn.net/hello_hwc 前言: UploadTask继承自DataTask.不难理解,因为UploadTask只不过在Http请求的时候,把数据放到Http Body中.所以,用UploadTask来做的事情,通常直接用DataTask也可以实现.不过,能使用封装好的API会省去很多事情,何乐而不为呢? Demo下载链接 http://download.csdn.net/detail/hello_hwc/8557791 Demo里包括了三种T

ios网络开发 AFNetworking

一.早前的几个网络框架 1.ASI框架: HTTP终结者.很牛, 但是有BUG, 已经停止更新. 2.MKNetworkKit (印度人写的). 3.AFN一直还在更新. AFNetworking的出现:MAC/iOS设计的一套网络框架.(为了简化网络操作) 地址:https://github.com/AFNetworking/AFNetworking *AFN专注与网络数据传输,以及网络中多线程的处理. 二.AFNetworking的使用 1.AFN特性 : *登录传参数时,传递字典即可.(键

IOS网络开发(二)

1 局域网群聊软件 1.1 问题 UDP协议将独立的数据包从一台计算机传输到另外一台计算机,但是并不保证接受方能够接收到该数据包,也不保证接收方所接收到的数据和发送方所发送的数据在内容和顺序上是完全一致的. UDP广播就是建立于UDP协议上的数据传输,当网络中的某一台计算机向交换机或路由发送一个广播数据时,交换机或路由则会将此广播数据发送到其节点下的所有接收者.本案例使用第三方Socket编程框架AsyncUdpSocket框架,基于UDP广播实现一个局域网群聊软件,一个基于UD广播的聊天室程序

ios网络开发 网络状态检查

http://www.cnblogs.com/hanjun/archive/2012/12/01/2797622.html 网络连接中用到的类: 一.Reachability 1.添加 Reachability 的.h和.m文件,再添加SystemConfiguration.framework. 2.Reachability中定义了三种网络状态: typedef Num{ NotReachable = 0,  //无连接 ReachableViaWiFi,  //使用3G/GPRS网络 Reac