On-Demand Resources: что это, механизм запроса и хранение ресурсов

Автор: IT Sectr Опубликовано: 2026-04-17 Время чтения: 9 мин

On-Demand Resources — это технология Apple для отложенной загрузки контента приложения. Вместо того чтобы включать все ресурсы в установочный пакет, разработчик размещает их на серверах App Store и запрашивает по мере необходимости. По данным Apple ODR Guide, это позволяет сократить размер начальной установки и добавлять новый контент без обновления версии приложения.

Главное

  • On-Demand Resources — механизм загрузки ресурсов по требованию после установки приложения
  • Ресурсы хранятся на серверах Apple и запрашиваются через NSBundleResourceRequest
  • Теги группируют ресурсы по функциональным блокам приложения
  • Prefetching позволяет загружать ресурсы заранее для улучшения UX
  • Квоты хранилища ограничены и требуют мониторинга со стороны разработчика

Что такое On-Demand Resources в iOS

On-Demand Resources (ODR) — это система управления контентом, встроенная в iOS, tvOS и macOS. Она позволяет разработчику разделить ресурсы приложения на обязательные (входят в установочный пакет) и загружаемые по требованию (хранятся в App Store и скачиваются при необходимости).

Основные понятия ODR

Система ODR оперирует тремя ключевыми сущностями: теги, ресурсные пакеты и запросы. Тег — это строка-идентификатор, которая объединяет группу файлов. Ресурсный пакет — набор данных, ассоциированных с тегом. Запрос — программный вызов NSBundleResourceRequest, инициирующий загрузку пакета.

Жизненный цикл запроса ресурса

Загрузка ресурса проходит несколько стадий: инициализация запроса с указанием тегов, проверка доступности в локальном хранилище, скачивание с серверов Apple при отсутствии, уведомление приложения о готовности и освобождение ресурса после использования. Система автоматически управляет кэшированием и удалением неиспользуемых ресурсов.

СтадияДействие системыВремя выполнения
ИнициализацияСоздание NSBundleResourceRequest с тегомМгновенно
Проверка кэшаПоиск ресурса в локальном хранилище0.1–0.5 с
ЗагрузкаСкачивание с CDN AppleЗависит от размера
УведомлениеВызов completion handler или делегатаМгновенно
ОсвобождениеПометка ресурса как удаляемого системойПо требованию iOS

Как работает ODR в iOS

Механизм ODR основан на фоновой службе, которая управляет запросами ресурсов из облачного хранилища App Store. Когда приложение запрашивает тег, система проверяет, есть ли ресурс в локальном кэше. Если нет — начинает загрузку через фоновый URL-сессию с поддержкой возобновления при обрыве соединения.

Управление запросами через NSBundleResourceRequest

swift
import Foundation

class ResourceManager {
    let odrRequest = NSBundleResourceRequest(tags: ["level-3"])

    func loadLevel3() {
        odrRequest.conditionallyBeginAccessingResources { available in
            if available {
                self.startLevel3()
            } else {
                self.odrRequest.beginAccessingResources { error in
                    guard error == nil else { return }
                    self.startLevel3()
                }
            }
        }
    }

    func releaseResources() {
        odrRequest.endAccessingResources()
    }
}

Метод conditionallyBeginAccessingResources проверяет наличие ресурса в кэше без немедленной загрузки. Если флаг доступности положительный — приложение продолжает работу без задержки. Если ресурс отсутствует, beginAccessingResources запускает скачивание с индикацией прогресса через свойство progress.

Фоновая загрузка и приоритеты

Система iOS сама управляет приоритетами загрузки ODR-ресурсов в зависимости от текущей активности приложения. Если приложение находится на переднем плане, загрузка выполняется с высоким приоритетом. В фоновом режиме iOS может отложить загрузку или приостановить её при низком заряде батареи.

  • High priority — немедленная загрузка для ресурсов, нужных прямо сейчас
  • Low priority — отложенная загрузка для prefetching и предварительного кэширования
  • Background — загрузка только при активном Wi-Fi и достаточном заряде

Типы ресурсов и теги ODR

Ресурсы ODR могут включать изображения, видео, аудиофайлы, спрайты, данные уровней и любые другие файлы, не критичные для запуска приложения. Каждый ресурс привязывается к одному или нескольким тегам, которые определяют его принадлежность к функциональному блоку.

Content Tagging в Xcode

В Xcode теги настраиваются через инспектор Resource Tags на вкладке Target Membership. Разработчик указывает для каждого файла в проекте, входит ли он в основной бандл или загружается по тегу. Один файл может принадлежать нескольким тегам, что позволяет переиспользовать ресурсы между разными разделами приложения.

xml
<!-- Пример конфигурации Resource Tags в Info.plist -->
<key>NSBundleResourceRequestTags</key>
<dict>
    <key>level-3</key>
    <array>
        <string>levels/level3.scnassets</string>
        <string>textures/level3_tex.png</string>
    </array>
</dict>

Категории тегов по времени жизни

Apple выделяет три категории ODR-тегов в зависимости от того, как долго ресурс должен храниться на устройстве. Initial Install Tags загружаются вместе с приложением и никогда не удаляются системой. Prefetch Tag Order определяет порядок фоновой подгрузки сразу после установки. Основные теги запрашиваются по требованию и могут быть удалены iOS при нехватке места.

Кроме категорий, каждый тег может иметь приоритет загрузки. Теги с высоким приоритетом загружаются перед низкоприоритетными, даже если они были запрошены позже. Это позволяет разработчику управлять порядком появления контента: сначала критичные ресурсы для основного экрана, затем дополнительные материалы для глубоких разделов приложения.

  • Initial install tags — загружаются при первой установке, не удаляются системой
  • Prefetched tags — скачиваются в фоне после установки для улучшения UX
  • On-demand tags — запрашиваются программно, могут быть удалены iOS при дефиците места

Настройка On-Demand Resources в Xcode

Настройка ODR в Xcode включает три этапа: категоризация ресурсов по тегам, конфигурация параметров загрузки в Info.plist и программная реализация запросов через NSBundleResourceRequest. Большая часть работы выполняется на стороне сборки проекта.

Категоризация в Target Membership

swift
// Проверка статуса и мониторинг прогресса ODR
func monitorODRProgress(tag: String) {
    let request = NSBundleResourceRequest(tags: [tag])
    let observer = request.progress.observe(\.fractionCompleted) { progress, _ in
        DispatchQueue.main.async {
            let percent = Int(progress.fractionCompleted * 100)
            print("ODR: \(percent)% loaded")
        }
    }
}

Прогресс загрузки отслеживается через свойство progress класса NSProgress с поддержкой KVO-наблюдения. Приложение может отображать индикатор загрузки пользователю во время скачивания ресурсов. После завершения загрузки ресурсы доступны в основном бандле приложения через стандартные механизмы FileManager и NSDataAsset.

Параметры квот и ограничений

Квоты на ODR зависят от версии iOS. Начиная с iOS 13, устройство может хранить до 20 ГБ загруженных по требованию ресурсов на один аккаунт. Этот объём распределяется между всеми приложениями, установленными на устройстве — если одно приложение заняло много места, другим остаётся меньше.

Мониторинг занятого места выполняется через NSBundleResourceRequest. Приложение может проверять доступное ODR-хранилище и в зависимости от этого решать, какие ресурсы загружать в первую очередь. Рекомендуется реализовать fallback-механизм: если ODR-хранилище переполнено, использовать ресурсы из основного бандла уменьшенного качества.

При превышении квоты система удаляет ресурсы с тегами On-Demand в порядке наименьшего недавнего использования, начиная с самых старых. Resource Manager в коде приложения может отслеживать текущий объём занятого ODR-хранилища через свойство NSBundleResourceRequest.

Разработчику важно учитывать, что iOS может в любой момент принять решение об удалении On-Demand ресурсов — приложение должно корректно обрабатывать ситуацию, когда ранее загруженный ресурс внезапно недоступен. Рекомендуется перехватывать ошибки доступа к ресурсам и повторно запрашивать их через beginAccessingResources. Для критически важных ресурсов, без которых приложение не может функционировать, используйте Initial Install Tags, которые не удаляются системой.

Преимущества и ограничения ODR

On-Demand Resources дают разработчику гибкий инструмент управления размером приложения, но накладывают ряд ограничений, связанных с доступностью сети и политиками хранилища iOS.

Преимущества использования ODR

Главное преимущество ODR — радикальное сокращение размера начальной установки. Игры с несколькими уровнями, приложения с видео-контентом или большими наборами изображений могут загружать контент порционно. Пользователь получает доступ к базовому функционалу сразу, а дополнительные ресурсы скачиваются фоном.

Ограничения технологии

ODR требует постоянного подключения к интернету для загрузки ресурсов при первом обращении. Пользователь в зоне с плохим покрытием может столкнуться с задержками и ошибками загрузки. Кроме того, Apple не гарантирует, что загруженные ресурсы останутся на устройстве — при нехватке места iOS может удалить On-Demand теги без предупреждения.

  • Необходимость сети — первый запрос ресурса требует подключения к интернету
  • Автоматическое удаление — iOS может очистить кэш при нехватке места на устройстве
  • Сложность отладки — воспроизведение проблем с загрузкой требует симуляции различных сетевых условий
  • Размер тега — Apple рекомендует не превышать 512 МБ на один тег для оптимальной производительности
  • Обработка ошибок — приложение должно корректно обрабатывать сбои загрузки и повторять запросы

Часто задаваемые вопросы

Можно ли использовать ODR для динамического добавления контента без обновления приложения?

ODR позволяет добавлять и изменять ресурсы без публикации новой версии в App Store. Достаточно обновить файлы на сервере Apple через Xcode и назначить их тем же тегам. При следующем запросе приложение получит актуальную версию ресурса. Это удобно для сезонного контента, временных промо-акций и A/B тестирования новых изображений и макетов.

Как iOS управляет удалением ODR-ресурсов при нехватке места?

Система удаляет ресурсы с меткой On-Demand, когда требуется освободить место для других приложений. Ресурсы Initial Install Tags не удаляются. Порядок удаления определяется алгоритмом LRU (Least Recently Used) — первыми удаляются ресурсы, к которым дольше всего не обращались.

Какой максимальный размер ODR-ресурсов для одного приложения?

Начиная с iOS 13, общий лимит ODR-хранилища составляет 20 ГБ на один Apple ID пользователя. Размер одного тега не должен превышать 512 МБ для оптимальной производительности загрузки. При превышении лимита запросы завершаются ошибкой NSBundleResourceRequestLowDiskSpaceError.

Работает ли ODR в офлайн-режиме после первоначальной загрузки?

Да, после загрузки ресурс сохраняется в локальном кэше и доступен в офлайн-режиме без подключения к интернету. Проблемы возникают только если iOS удалила ресурс из-за нехватки места и пользователь пытается обратиться к нему без сети.

Чем ODR отличается от простой загрузки файлов через URLSession?

ODR интегрирован с инфраструктурой App Store: ресурсы хостятся на CDN Apple, управляются системой кэширования и не требуют от разработчика организации собственного сервера. URLSession требует серверной инфраструктуры, контроля версий и ручного управления кэшем. ODR также автоматически обрабатывает возобновление загрузки при обрыве соединения.

Итоги

  • On-Demand Resources — технология отложенной загрузки контента в iOS и tvOS приложениях
  • Система основана на тегах, группирующих ресурсы, и запросах через NSBundleResourceRequest
  • Поддерживаются все типы файлов: изображения, видео, аудио, спрайты и данные уровней
  • Категории тегов — Initial Install, Prefetched и On-Demand с разными политиками хранения
  • Лимит хранилища — 20 ГБ на Apple ID, до 512 МБ на один тег
  • Размер установки сокращается за счёт выноса ресурсов из основного бандла на серверы Apple
  • Рекомендация — использовать ODR для игр, приложений с медиа-контентом и проектов с многоуровневой структурой

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также