On-Demand Resources „је Apple технологија за одложено учитавање садржаја апликације”. Уместо да укључи све ресурсе у инсталациони пакет, програмер их поставља на App Store сервере и захтева по потреби. Према Apple ODR Guide, ово омогућава смањење величине почетне инсталације и додавање новог садржаја без ажурирања верзије апликације.
Главно
On-Demand Resources (ODR) „је систем за управљање садржајем уграђен у iOS, tvOS и macOS”. Он омогућава програмеру да подели ресурсе апликације на обавезне (улазе у инсталациони пакет) и оне који се учитавају на захтев (чувају се у App Store-у и преузимају по потреби).
ODR систем оперише са три кључна ентитета: ознаке, ресурсни пакети и захтеви. Ознака је низ знакова који идентификује групу датотека. Ресурсни пакет је скуп података повезаних са ознаком. Захтев је програмски позив NSBundleResourceRequest који покреће учитавање пакета.
Учитавање ресурса пролази кроз неколико фаза: иницијализација захтева са навођењем ознака, провера доступности у локалном складишту, преузимање са Apple сервера у одсуству, обавештавање апликације о спремности и ослобађање ресурса након употребе. Систем аутоматски управља кеширањем и брисањем неискоришћених ресурса.
| Фаза | Акција система | Време извршења |
|---|---|---|
| Иницијализација | Креирање NSBundleResourceRequest са ознаком | Тренутно |
| Провера кеша | Претрага ресурса у локалном складишту | 0,1–0,5 с |
| Преузимање | Скидање са Apple CDN-а | Зависи од величине |
| Обавештење | Позив completion handler-а или делегата | Тренутно |
| Ослобађање | Означавање ресурса као обрисивог од стране система | На захтев iOS-а |
ODR механизам се заснива на позадинској услузи која управља захтевима за ресурсима из облака App Store-а. Када апликација затражи ознаку, систем проверава да ли ресурс постоји у локалном кешу. Ако не „ покреће преузимање путем позадинске URL сесије са подршком за наставак при прекиду везе.
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 може одложити учитавање или га обуставити при ниској батерији.
ODR ресурси могу укључивати слике, видео записе, аудио датотеке, спрајтове, податке нивоа и све друге датотеке које нису критичне за покретање апликације. Сваки ресурс је везан за једну или више ознака које одређују његову припадност функционалном блоку.
У Xcode-у, ознаке се подешавају путем инспектора Resource Tags на картици Target Membership. Програмер за сваку датотеку у пројекту одређује да ли је део главног пакета или се учитава путем ознаке. Једна датотека може припадати више ознака, што омогућава поновну употребу ресурса између различитих делова апликације.
<!-- Пример конфигурације 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-а при недостатку простора.
Поред категорија, свака ознака може имати приоритет учитавања. Ознаке са високим приоритетом се учитавају пре оних са ниским приоритетом, чак и ако су захтеване касније. Ово омогућава програмеру да управља редоследом појављивања садржаја: прво критични ресурси за главни екран, затим додатни материјали за дубоке делове апликације.
Подешавање ODR-а у Xcode-у укључује три корака: категоризација ресурса по ознакама, конфигурација параметара учитавања у Info.plist-у и програмска имплементација захтева путем NSBundleResourceRequest. Већина посла се обавља на страни изградње пројекта.
// Провера статуса и праћење напретка 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 које систем не брише.
On-Demand Resources пружају програмеру флексибилан алат за управљање величином апликације, али намећу низ ограничења повезаних са доступношћу мреже и политикама складиштења iOS-а.
Главна предност ODR-а „ радикално смањење величине почетне инсталације. Игре са више нивоа, апликације са видео садржајем или великим скуповима слика могу да учитавају садржај у деловима. Корисник добија приступ основном функционалности одмах, а додатни ресурси се преузимају у позадини.
ODR захтева сталну интернет везу за учитавање ресурса при првом приступу. Корисник у зони са слабим покривањем може наићи на кашњења и грешке при учитавању. Поред тога, Apple не гарантује да ће учитани ресурси остати на уређају „ при недостатку простора, iOS може обрисати On-Demand ознаке без упозорења.
Често постављана питања
ODR омогућава додавање и измену ресурса без објављивања нове верзије у App Store-у. Довољно је ажурирати датотеке на Apple серверу путем Xcode-а и доделити их истим ознакама. При следећем захтеву, апликација ће добити тренутну верзију ресурса. Ово је згодно за сезонски садржај, привремене промоције и A/B тестирање нових слика и распореда.
Систем брише ресурсе са On-Demand ознаком када треба ослободити простор за друге апликације. Initial Install Tags ресурси се не бришу. Редослед брисања одређује алгоритам LRU (Least Recently Used) „ прво се бришу ресурси којима се најдуже није приступало.
Почев од iOS 13, укупна граница ODR складишта је 20 GB по Apple ID-у корисника. Величина једне ознаке не би требало да прелази 512 MB за оптималне перформансе учитавања. При прекорачењу границе, захтеви се завршавају грешком NSBundleResourceRequestLowDiskSpaceError.
Да, након учитавања, ресурс се чува у локалном кешу и доступан је у офлајн режиму без интернет везе. Проблеми настају само ако је iOS обрисао ресурс због недостатка простора и корисник покушава да му приступи без мреже.
ODR је интегрисан са App Store инфраструктуром: ресурси се хостирају на Apple CDN-у, управљају се системом кеширања и не захтевају од програмера организовање сопственог сервера. URLSession захтева серверску инфраструктуру, контролу верзија и ручно управљање кешом. ODR такође аутоматски обрађује наставак преузимања при прекиду везе.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође