这里我们只讨论iOS平台下的通用app,我们可以自己写代码来实现resume downloads,解释如下。

resume一个HTTP下载不难,但必须要理解一些关键的HTTP概念:

  • entity tag:这是一个服务器提供的唯一的标识符,表示一个特定资源的特定版本;如果有人改变了服务器上得这个资源,entity tag会变。
  • Range header:通过这个,你可以请求一个资源指定范围内的byte。
  • If-Range header:这个表示,你想要一个资源指定范围内的bytes,如果entity tag没有改变的话。

注意:如果服务器没有提供entity tag,可以用当前时间代替。

Resuming download的基本策略如下:

  1. 如果已经初始化了下载,把与资源相关的entity tag纯起来;
  2. 当把数据存到磁盘上的时候,记住多少数据是有效的;
  3. 要resume 下载的时候,得到entity tag和已经存得数据的数量,并且把这些值给 提供Range和If-Range头的request;
  4. 执行request。成功(你收到这个资源的剩余部分),或者失败(防止你从零开始请求资源)。

一个HTTP resume request:

GET /download.info.apple.com/[...]/MacOSXUpdCombo10.6.8.dmg HTTP/1.1
Host: supportdownload.apple.com
User-Agent: Safari/7534.52.7 [...]
Accept: */*
If-Range: "968f3f3e86e0339ce722170ae656bc73:1319461845"
Range: bytes=4041400-
Accept-Language: en-au
Accept-Encoding: gzip, deflate
[...]
Connection: keep-alive

Range头告诉服务器你想从偏移量4041400处开始得到数据。If-Range头告诉服务器,我只想在服务器的entity tag给我之后,数据没有改变的情况下,得到数据。

一个HTTP resume response:

HTTP/1.1 206 Partial Content
Server: Apache
Accept-Ranges: bytes
Content-Type: application/octet-stream
Last-Modified: Mon, 24 Oct 2011 13:04:42 GMT
ETag: "968f3f3e86e0339ce722170ae656bc73:1319461845"
Date: Mon, 23 Jan 2012 16:13:25 GMT
Content-Range: bytes 4041400-1087036999/1087037000
Content-Length: 1082995600
Connection: keep-alive

HTTP状态码206表明response仅仅包括请求资源的一个子集(一部分),Content-Range头准确的表示了返回资源的范围(从 4041400到1087036999的字节)和资源的总长度(1087037000)。Content-Length头告诉你在这个响应中服务器返回的字节数。

【iOS】Resumable Doanloads(断点下载)的更多相关文章

  1. iOS 大文件断点下载

    iOS 在下载大文件的时候,可能会因为网络或者人为等原因,使得下载中断,那么如何能够进行断点下载呢? // resumeData的文件路径 #define XMGResumeDataFile [[NS ...

  2. iOS开发——网络篇——NSURLSession,下载、上传代理方法,利用NSURLSession断点下载,AFN基本使用,网络检测,NSURLConnection补充

    一.NSURLConnection补充 前面提到的NSURLConnection有些知识点需要补充 NSURLConnectionDataDelegate的代理方法有一下几个 - (void)conn ...

  3. iOS开发网络篇—大文件的多线程断点下载

    http://www.cnblogs.com/wendingding/p/3947550.html iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时 ...

  4. iOS开发网络请求——大文件的多线程断点下载

    iOS开发中网络请求技术已经是移动app必备技术,而网络中文件传输就是其中重点了.网络文件传输对移动客户端而言主要分为文件的上传和下载.作为开发者从技术角度会将文件分为小文件和大文件.小文件因为文件大 ...

  5. iOS开发网络篇—大文件的多线程断点下载(转)

    http://www.cnblogs.com/wendingding/p/3947550.html   iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了 ...

  6. iOS开发网络篇—多线程断点下载

    iOS开发网络篇—多线程断点下载 说明:本文介绍多线程断点下载.项目中使用了苹果自带的类,实现了同时开启多条线程下载一个较大的文件.因为实现过程较为复杂,所以下面贴出完整的代码. 实现思路:下载开始, ...

  7. ios网络 -- HTTP请求 and 文件下载/断点下载

    一:请求 http://www.jianshu.com/p/8a90aa6bad6b 二:下载 iOS网络--『文件下载.断点下载』的实现(一):NSURLConnection http://www. ...

  8. IOS 断点下载

    // // ViewController.m // UI4_断点下载 // // Created by qianfeng on 15/8/19. // Copyright (c) 2015年 ZBC. ...

  9. iOS开发-大文件下载与断点下载思路

    大文件下载方案一:利用NSURLConnection和它的代理方法,及NSFileHandle(iOS9后不建议使用)相关变量: @property (nonatomic,strong) NSFile ...

  10. iOS开发 -------- AFNetworking实现简单的断点下载

    一 实现如下效果   二 实现代码 // // ViewController.m // AFNetworking实现断点下载 // // Created by lovestarfish on 15/1 ...

随机推荐

  1. Swift - 02 - 常量和变量

    //: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...

  2. SpringMVC简单搭建与入门

    SpringMVC框架是spring框架的一个模块.springmvc和spring无需要通过中间整合层进行整合. 学习的时候,先了解一下流程至关重要,下面,简单介绍一下流程. 源码下载:http:/ ...

  3. SQL中varchar和nvarchar有什么区别?

    varchar(n)长度为 n 个字节的可变长度且非 Unicode 的字符数据.n 必须是一个介于 1 和 8,000 之间的数值.存储大小为输入数据的字节的实际长度,而不是 n 个字节.nvarc ...

  4. cmakelists 语法学习

    1.项目最外层cmake编写:----------用于kdevelop编译器 project(filtering) cmake_minimum_required(VERSION 2.8) ————必须 ...

  5. C++ Primer 5th 第16章 模板与泛型编程

    模板是C++中泛型编程的基础,一个模板就是创建一个类或者函数的蓝图或者说公式. C++模板分为函数模板和类模板. 类模板则可以是整个类是个模板,类的某个成员函数是个模板,以及类本身和成员函数分别是不同 ...

  6. 初涉JavaScript模式 (11) : 模块模式

    引子 这篇算是对第9篇中内容的发散和补充,当时我只是把模块模式中的一些内容简单的归为函数篇中去,在北川的提醒下,我才发觉这是非常不严谨的,于是我把这些内容拎出来,这就是这篇的由来. 什么是模块模式 在 ...

  7. javascript在一个字符串中每隔多少字符插入某个字符串

    function insertStr(str,tar,n,m){ var x='' var str=str.split('') if(str.length==0) return for(var i=n ...

  8. 让 IE6/7/8 也支持HTML5标签的方式

    方式一:引入Google的HTML5.js线上文件 <!–[if lt IE9]> <script src="http://html5shiv.googlecode.com ...

  9. [Python笔记]第八篇:模块

    本篇主要内容:python常用模块用法介绍 什么是模块 模块,用一大段代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性 ...

  10. Python3.4+opencv3

    1.安装Python 3.4 for Windows 好的这好像没有什么可以说的 2.下载OpenCV 3和Numpy(OpenCV依赖Numpy库) 大家在这里就出了问题.如果使用直接使用pip i ...