Загрузки Resumable
Q: Мои загрузки приложений большие файлы по HTTP. Как я могу возобновить частично завершенную загрузку?
A: Ответ зависит от Вашей целевой платформы:
Если Вы работаете над Mac OS X, просто возобновить загрузки с помощью класса NSURLDownload. См. Руководство по программированию Загрузочной системы URL для получения дополнительной информации об этом.
NSURLDownload не поддерживается на iOS. Однако, если Вы - приложение Ньюсстэнда, у Ньюсстэнда есть встроенная поддержка возобновления загрузок. Посмотрите Ньюсстэнда Кита Фрэмеуорка Референса для подробных данных.
Если Вы - универсальное приложение для iOS, необходимо будет записать код для возобновления загрузок сами, как объяснено ниже.
Возобновление Загрузки http не является слишком трудным, но необходимо понять некоторые критические понятия HTTP:
тег объекта — Это - уникальный идентификатор, предоставленный сервером, обозначающим определенную версию определенного ресурса; если кто-то изменит ресурс на сервере, то тег объекта изменится.
Заголовок диапазона — Это позволяет Вам запрашивать определенный диапазон байтов от ресурса.
Заголовок если-диапазона — Этот заголовок указывает, что Вы только хотите получить диапазон байтов от ресурса, если не изменился тег объекта.
Основная стратегия возобновления загрузки:
То, когда Вы делаете начальную загрузку, сохраняете тег объекта, связало ресурс.
Поскольку Вы сохраняете данные на диск, помните, сколько из данных допустимо.
Когда Вы приезжаете, чтобы возобновить загрузку, получить тег объекта и объем данных, Вы сохранили и применяете эти значения к запросу через
RangeиIf-Rangeзаголовки.Выполните запрос. Это или успешно выполнится (и Вы получите остающиеся байты ресурса), или это перестанет работать (когда необходимо получить весь ресурс с нуля).
Если сервер не делает тегов вспомогательного объекта, можно сделать подобные вещи с измененной в последний раз датой.
Для конкретного примера этого можно использовать трассировку пакетов (см. Технические Вопросы и ответы QA1176, 'Получение Трассировки пакетов') смотреть на то, как Safari возобновляет загрузку на Mac. Перечисление 1 показывает типичный запрос резюме.
Перечисление 1 HTTP возобновляет запрос
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 заголовок говорит серверу, что Вы только хотите те данные, если данные не изменились, так как сервер дал клиенту предоставленный тег объекта (т.е. «968f3f3e86e0339ce722170ae656bc73:1319461845»).
Перечисление 2 показывает соответствующий ответ.
Перечисление 2 HTTP возобновляет ответ
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) говорит Вам, что ответ только содержит подмножество ресурса. Content-Range заголовок говорит Вам точно, какой диапазон ресурса сервер возвращает (байт 4041400 через к байту 1087036999) и общая длина ресурса (1087037000). Наконец, Content-Length заголовок говорит Вам, сколько байтов сервер возвращается в этом определенном ответе.
История версии документа
| Дата | Примечания |
|---|---|
| 13.02.2012 | Новый документ, объясняющий, как возобновить Загрузки http. |