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 с
ИзтеглянеИзтегляне от Apple CDNЗависи от размера
УведомяванеИзвикване на 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 може да забави зареждането или да го спре при ниско ниво на батерията.

  • Висок приоритет „незабавно зареждане за ресурси, необходими веднага”
  • Нисък приоритет „отложено зареждане за предварително кеширане”
  • Фонов режим „зареждане само с активен Wi-Fi и достатъчно батерия”

Типове ресурси и ODR етикети

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

Етикетиране на съдържание в 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)% заредено")
        }
    }
}

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

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

Квотите за ODR зависят от версията на iOS. От iOS 13 нататък устройството може да съхранява до 20 GB заредени при поискване ресурси на един акаунт. Този обем се разпределя между всички приложения, инсталирани на устройството „ ако едно приложение заема много място, за останалите остава по-малко.

Мониторинг на заетото място се извършва чрез 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 MB на етикет за оптимална производителност”
  • Обработка на грешки „приложението трябва правилно да обработва грешки при зареждане и да повтаря заявките”

Често задавани въпроси

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

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

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

Системата изтрива ресурси с маркировка On-Demand, когато трябва да освободи място за други приложения. Ресурсите с Initial Install Tags не се изтриват. Редът на изтриване се определя от алгоритъма LRU (Least Recently Used) „ първо се изтриват ресурсите, които не са били достъпвани най-дълго време.

Какъв е максималният размер на ODR ресурсите за едно приложение?

От iOS 13 общият лимит на ODR хранилището е 20 GB на Apple ID на потребителя. Размерът на един етикет не трябва да надвишава 512 MB за оптимална производителност при зареждане. При превишаване на лимита заявките завършват с грешка NSBundleResourceRequestLowDiskSpaceError.

Работи ли ODR в офлайн режим след първоначално зареждане?

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

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

ODR е интегриран с инфраструктурата на App Store: ресурсите се хостват на Apple CDN, управляват се от системата за кеширане и не изискват от разработчика организиране на собствен сървър. URLSession изисква сървърна инфраструктура, контрол на версиите и ръчно управление на кеша. ODR също така автоматично обработва възобновяване на изтеглянето при прекъсване на връзката.

Резюме

  • On-Demand Resources „технология за отложено зареждане на съдържание в iOS и tvOS приложения”
  • Системата се основава на етикети, групиращи ресурси, и заявки чрез NSBundleResourceRequest
  • Поддържат се всички типове файлове: изображения, видео, аудио, спрайтове и данни за нива
  • Категории етикети „ Initial Install, Prefetched и On-Demand с различни политики за съхранение”
  • Лимит на хранилището „ 20 GB на Apple ID, до 512 MB на етикет”
  • Размерът на инсталацията се намалява чрез преместване на ресурси от основния пакет на сървърите на Apple
  • Препоръка „ използвайте ODR за игри, приложения с медийно съдържание и проекти с многослойна структура”

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

IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също