On-Demand Resources „az Apple technológiája az alkalmazás tartalmának késleltetett betöltésére”. Ahelyett, hogy az összes erőforrást a telepítőcsomagba foglalná, a fejlesztő az App Store szerverein helyezi el őket, és szükség szerint kéri le. Az Apple ODR Guide szerint ez lehetővé teszi a kezdeti telepítés méretének csökkentését és új tartalom hozzáadását az alkalmazás verziójának frissítése nélkül.
Főbb pontok
On-Demand Resources (ODR) „az iOS-be, tvOS-be és macOS-be épített tartalomkezelő rendszer”. Lehetővé teszi a fejlesztő számára, hogy az alkalmazás erőforrásait kötelező (a telepítőcsomag részét képező) és igény szerint betölthető (az App Store-ban tárolt és szükség esetén letöltött) részekre ossza.
Az ODR rendszer három kulcsfontosságú entitással működik: címkék, erőforráscsomagok és kérések. A címke egy azonosító sztring, amely egyesíti a fájlok csoportját. Az erőforráscsomag egy címkéhez társított adathalmaz. A kérés egy NSBundleResourceRequest programozott hívása, amely elindítja a csomag betöltését.
Az erőforrás betöltése több szakaszon megy keresztül: a kérés inicializálása a címkék megadásával, a helyi tárban való elérhetőség ellenőrzése, letöltés az Apple szervereiről hiány esetén, az alkalmazás értesítése a készenlétről, és az erőforrás felszabadítása használat után. A rendszer automatikusan kezeli a gyorsítótárazást és a nem használt erőforrások törlését.
| Szakasz | Rendszer művelete | Végrehajtási idő |
|---|---|---|
| Inicializálás | NSBundleResourceRequest létrehozása címkével | Azonnal |
| Gyorsítótár ellenőrzés | Erőforrás keresése a helyi tárban | 0,1–0,5 mp |
| Letöltés | Letöltés az Apple CDN-ről | Mérettől függ |
| Értesítés | Completion handler vagy delegált hívása | Azonnal |
| Felszabadítás | Erőforrás megjelölése a rendszer által törölhetőként | iOS kérésére |
Az ODR mechanizmus egy háttérszolgáltatáson alapul, amely az App Store felhőtárhelyéről érkező erőforráskéréseket kezeli. Amikor az alkalmazás egy címkét kér, a rendszer ellenőrzi, hogy az erőforrás a helyi gyorsítótárban van-e. Ha nem „ elindítja a letöltést egy háttér URL-munkameneten keresztül, amely támogatja a megszakadt kapcsolat utáni folytatást.
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()
}
}
A conditionallyBeginAccessingResources metódus ellenőrzi az erőforrás elérhetőségét a gyorsítótárban azonnali betöltés nélkül. Ha az elérhetőségi jelző pozitív „ az alkalmazás késedelem nélkül folytatja a munkát. Ha az erőforrás hiányzik, a beginAccessingResources elindítja a letöltést a progress tulajdonságon keresztüli előrehaladás-jelzéssel.
Az iOS rendszer maga kezeli az ODR-erőforrások betöltési prioritásait az alkalmazás aktuális tevékenységétől függően. Ha az alkalmazás az előtérben van, a betöltés magas prioritással történik. A háttérben az iOS késleltetheti a betöltést vagy felfüggesztheti azt alacsony akkumulátorszint esetén.
Az ODR-erőforrások tartalmazhatnak képeket, videókat, hangfájlokat, sprite-okat, szintadatokat és bármilyen egyéb fájlt, amely nem kritikus az alkalmazás indításához. Minden erőforrás egy vagy több címkéhez van kötve, amelyek meghatározzák a funkcionális blokkhoz való tartozását.
Az Xcode-ban a címkéket a Resource Tags ellenőrző segítségével konfigurálja a Target Membership fülön. A fejlesztő minden projekten belüli fájlhoz meghatározza, hogy az a fő csomag része-e vagy címkén keresztül töltődik be. Egy fájl több címkéhez is tartozhat, lehetővé téve az erőforrások újrafelhasználását az alkalmazás különböző szakaszai között.
<!-- Példa a Resource Tags konfigurációra Info.plist-ben -->
<key>NSBundleResourceRequestTags</key>
<dict>
<key>level-3</key>
<array>
<string>levels/level3.scnassets</string>
<string>textures/level3_tex.png</string>
</array>
</dict>
Az Apple három ODR-címke kategóriát különböztet meg attól függően, hogy az erőforrás mennyi ideig tárolódjon az eszközön. Az Initial Install Tags az alkalmazással együtt töltődnek be, és a rendszer soha nem törli őket. A Prefetch Tag Order meghatározza a háttérbetöltés sorrendjét közvetlenül a telepítés után. A fő címkék igény szerint töltődnek be, és iOS törölheti őket helyhiány esetén.
A kategóriákon kívül minden címkének lehet betöltési prioritása. A magas prioritású címkék a kis prioritásúak előtt töltődnek be, még akkor is, ha később kérték őket. Ez lehetővé teszi a fejlesztő számára a tartalom megjelenési sorrendjének kezelését: először a kritikus erőforrások a főképernyőhöz, majd a kiegészítő anyagok az alkalmazás mélyebb szakaszaihoz.
Az ODR konfigurálása az Xcode-ban három lépésből áll: az erőforrások kategorizálása címkék szerint, a betöltési paraméterek konfigurálása az Info.plist-ben, és a kérések programozott megvalósítása az NSBundleResourceRequest segítségével. A munka nagy része a projekt build oldalán történik.
// Az ODR állapotának ellenőrzése és előrehaladásának monitorozása
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)% betöltve")
}
}
}
A betöltés előrehaladását az NSProgress osztály progress tulajdonsága követi nyomon KVO-megfigyelés támogatásával. Az alkalmazás előrehaladási jelzőt jeleníthet meg a felhasználónak az erőforrások letöltése során. A betöltés befejezése után az erőforrások elérhetők az alkalmazás fő csomagjában a FileManager és az NSDataAsset szabványos mechanizmusain keresztül.
Az ODR-kvóták az iOS verziójától függnek. Az iOS 13-tól kezdve az eszköz fiókonként akár 20 GB igény szerint betöltött erőforrást is tárolhat. Ez a mennyiség az eszközre telepített összes alkalmazás között oszlik meg „ ha egy alkalmazás sok helyet foglal, a többieknek kevesebb marad.
A foglalt hely monitorozása az NSBundleResourceRequest segítségével történik. Az alkalmazás ellenőrizheti a rendelkezésre álló ODR-tárhelyet, és ennek alapján döntheti el, mely erőforrásokat töltse be elsőként. Fallback mechanizmus implementálása ajánlott: ha az ODR-tárhely megtelt, használja a fő csomagból származó, csökkentett minőségű erőforrásokat.
A kvóta túllépése esetén a rendszer a legrégebben nem használt erőforrások sorrendjében törli az On-Demand címkékkel ellátott erőforrásokat. Az alkalmazáskódban lévő Resource Manager az NSBundleResourceRequest tulajdonságon keresztül nyomon követheti az ODR-tárhely aktuális foglaltságát.A fejlesztőnek figyelembe kell vennie, hogy az iOS bármikor dönthet az On-Demand erőforrások törléséről „ az alkalmazásnak megfelelően kell kezelnie azt a helyzetet, amikor egy korábban betöltött erőforrás hirtelen nem elérhető. Javasolt az erőforrásokhoz való hozzáférési hibák elkapása és újbóli lekérése a beginAccessingResources segítségével. A kritikus erőforrásokhoz, amelyek nélkül az alkalmazás nem működhet, használja az Initial Install Tags-eket, amelyeket a rendszer nem töröl.
Az On-Demand Resources rugalmas eszközt biztosít a fejlesztőnek az alkalmazás méretének kezeléséhez, de számos korlátozást ír elő a hálózati elérhetőséggel és az iOS tárolási irányelveivel kapcsolatban.
Az ODR fő előnye „ a kezdeti telepítés méretének drasztikus csökkentése. A több szinttel rendelkező játékok, a videótartalmú alkalmazások vagy nagy képsorozatokkal rendelkező programok részletekben tölthetik be a tartalmat. A felhasználó azonnal hozzáfér az alapfunkciókhoz, a kiegészítő erőforrások pedig a háttérben töltődnek le.
Az ODR állandó internetkapcsolatot igényel az erőforrások első alkalommal történő betöltéséhez. A gyenge lefedettségű területen lévő felhasználó késéseket és betöltési hibákat tapasztalhat. Ezenkívül az Apple nem garantálja, hogy a betöltött erőforrások az eszközön maradnak „ helyhiány esetén az iOS figyelmeztetés nélkül törölheti az On-Demand címkéket.
Gyakran Ismételt Kérdések
Az ODR lehetővé teszi erőforrások hozzáadását és módosítását anélkül, hogy új verziót kellene közzétenni az App Store-ban. Elég frissíteni a fájlokat az Apple szerverén az Xcode-on keresztül, és hozzárendelni őket ugyanazokhoz a címkékhez. A következő kérésnél az alkalmazás megkapja az erőforrás aktuális verzióját. Ez kényelmes szezonális tartalomhoz, ideiglenes promóciókhoz és új képek és elrendezések A/B teszteléséhez.
A rendszer törli az On-Demand jelölésű erőforrásokat, amikor helyet kell felszabadítani más alkalmazások számára. Az Initial Install Tags erőforrások nem törlődnek. A törlési sorrendet az LRU (Least Recently Used) algoritmus határozza meg „ először azok az erőforrások törlődnek, amelyekhez a legrégebben nem fértek hozzá.
Az iOS 13-tól kezdve az ODR-tárhely teljes korlátja 20 GB felhasználónkénti Apple ID-nként. Egyetlen címke mérete nem haladhatja meg az 512 MB-ot az optimális betöltési teljesítmény érdekében. A korlát túllépése esetén a kérések NSBundleResourceRequestLowDiskSpaceError hibával végződnek.
Igen, a betöltés után az erőforrás a helyi gyorsítótárba kerül, és offline módban internetkapcsolat nélkül is elérhető. Problémák csak akkor merülnek fel, ha az iOS helyhiány miatt törölte az erőforrást, és a felhasználó hálózat nélkül próbál hozzáférni.
Az ODR integrálva van az App Store infrastruktúrájával: az erőforrások az Apple CDN-jén vannak tárolva, a gyorsítótárazó rendszer kezeli őket, és nem igényelnek a fejlesztőtől saját szerver beállítását. Az URLSession szerverinfrastruktúrát, verziókezelést és kézi gyorsítótár-kezelést igényel. Az ODR emellett automatikusan kezeli a letöltés folytatását a kapcsolat megszakadása esetén.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is