总结总结iOS开发中的断点续传与实践开发中的断点续传与实践
本文先从断点续传问题开始,介绍断点续传概述和原理。接着结合笔者调研中尝试的
AFHTTPRequestOpeartion,简单分析源码。最后分别基于 NSURLConnection,NSURLSessionDataTask 和
NSURLSessionDownloadTask 去实现应用重启情况下的断点续传。下面一起来看看。
前言前言
断点续传概述断点续传概述
断点续传就是从文件上次中断的地方开始重新下载或上传数据,而不是从文件开头。(本文的断点续传仅涉及下载,上传不在
讨论之内)当下载大文件的时候,如果没有实现断点续传功能,那么每次出现异常或者用户主动的暂停,都会去重头下载,这
样很浪费时间。所以项目中要实现大文件下载,断点续传功能就必不可少了。当然,断点续传有一种特殊的情况,就是 iOS
应用被用户 kill 掉或者应用 crash,要实现应用重启之后的断点续传。这种特殊情况是本文要解决的问题。
断点续传原理断点续传原理
要实现断点续传 , 服务器必须支持。目前最常见的是两种方式:FTP 和和 HTTP。
下面来简单介绍 HTTP 断点续传的原理。
HTTP
通过 HTTP,可以非常方便的实现断点续传。断点续传主要依赖于 HTTP 头部定义的 Range 来完成。在请求某范围内的资源
时,可以更有效地对大资源发出请求或从传输错误中恢复下载。有了 Range,应用可以通过 HTTP 请求曾经获取失败的资源
的某一个返回或者是部分,来恢复下载该资源。当然并不是所有的服务器都支持 Range,但大多数服务器是可以的。Range
是以字节计算的,请求的时候不必给出结尾字节数,因为请求方并不一定知道资源的大小。
Range 的定义如图 1 所示:
图图 1. HTTP-Range
图 2 展示了 HTTP request 的头部信息:
图图 2. HTTP request 例子例子
在上面的例子中的“Range: bytes=1208765-”表示请求资源开头 1208765 字节之后的部分。
图 3 展示了 HTTP response 的头部信息:
图图 3. HTTP response 例子例子