On-Demand Resources è la tecnologia Apple per il caricamento differito del contenuto dell’applicazione. Invece di includere tutte le risorse nel pacchetto di installazione, gli sviluppatori le ospitano sui server dell’App Store e le richiedono secondo necessità. Secondo Apple ODR Guide, ciò riduce la dimensione dell’installazione iniziale e consente di aggiungere nuovi contenuti senza aggiornare la versione dell’app.
Punti chiave
On-Demand Resources (ODR) è un sistema di gestione dei contenuti integrato in iOS, tvOS e macOS. Consente allo sviluppatore di suddividere le risorse dell’app in obbligatorie (incluse nel pacchetto di installazione) e su richiesta (memorizzate nell’App Store e scaricate quando necessario).
Il sistema ODR opera con tre entità principali: tag, pacchetti di risorse e richieste. Un tag è un identificatore di stringa che raggruppa un insieme di file. Un pacchetto di risorse è un set di dati associato a un tag. Una richiesta è una chiamata programmatica a NSBundleResourceRequest che avvia il caricamento del pacchetto.
Il caricamento delle risorse attraversa diverse fasi: inizializzazione della richiesta con i tag specificati, verifica della disponibilità nell’archivio locale, download dai server Apple se assente, notifica all’app quando pronto e rilascio della risorsa dopo l’uso. Il sistema gestisce automaticamente la memorizzazione nella cache e la rimozione delle risorse inutilizzate.
| Fase | Azione del sistema | Tempo di esecuzione |
|---|---|---|
| Inizializzazione | Creazione di NSBundleResourceRequest con un tag | Istantaneo |
| Controllo cache | Ricerca della risorsa nell’archivio locale | 0,1–0,5 s |
| Download | Download dalla CDN Apple | Dipende dalla dimensione |
| Notifica | Chiamata al completion handler o delegato | Istantaneo |
| Rilascio | Marcatura della risorsa come rimovibile dal sistema | Su richiesta di iOS |
Il meccanismo ODR si basa su un servizio in background che gestisce le richieste di risorse dall’archivio cloud dell’App Store. Quando l’app richiede un tag, il sistema verifica se la risorsa esiste nella cache locale. In caso contrario — avvia il download tramite una sessione URL in background con supporto per la ripresa delle connessioni interrotte.
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()
}
}
Il metodo conditionallyBeginAccessingResources verifica la disponibilità della risorsa nella cache senza caricamento immediato. Se il flag di disponibilità è positivo — l’app continua senza ritardo. Se la risorsa è assente, beginAccessingResources avvia il download con indicazione di avanzamento tramite la proprietà progress.
iOS gestisce le priorità di caricamento delle risorse ODR in base all’attività corrente dell’app. Quando l’app è in primo piano, il caricamento viene eseguito con priorità alta. In background, iOS può ritardare il caricamento o sospenderlo quando la batteria è scarica.
Le risorse ODR possono includere immagini, video, file audio, sprite, dati dei livelli e qualsiasi altro file non critico per l’avvio dell’app. Ogni risorsa è legata a uno o più tag che determinano la sua appartenenza a un blocco funzionale.
In Xcode, i tag vengono configurati tramite l’ispettore Resource Tags nella scheda Target Membership. Lo sviluppatore specifica per ogni file del progetto se è incluso nel bundle principale o caricato tramite tag. Un file può appartenere a più tag, consentendo il riutilizzo delle risorse in diverse sezioni dell’app.
<!-- Esempio di configurazione dei Resource Tags in 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 distingue tre categorie di tag ODR in base a quanto tempo una risorsa deve rimanere sul dispositivo. I tag di installazione iniziale vengono caricati con l’app e non vengono mai eliminati dal sistema. L’ordine di precaricamento dei tag determina la sequenza di caricamento in background immediatamente dopo l’installazione. I tag principali vengono richiesti su richiesta e possono essere eliminati da iOS quando lo spazio è insufficiente.
Oltre alle categorie, ogni tag può avere una priorità di download. I tag con priorità alta vengono caricati prima di quelli a priorità bassa, anche se sono stati richiesti dopo. Ciò consente allo sviluppatore di controllare l’ordine di apparizione dei contenuti: prima le risorse critiche per la schermata principale, poi i materiali aggiuntivi per le sezioni profonde dell’app.
La configurazione di ODR in Xcode include tre fasi: categorizzazione delle risorse per tag, configurazione dei parametri di download in Info.plist e implementazione programmatica delle richieste tramite NSBundleResourceRequest. La maggior parte del lavoro viene svolta sul lato build.
// Controllo dello stato e monitoraggio dell’avanzamento 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)% caricato")
}
}
}
L’avanzamento del download viene tracciato tramite la proprietà progress della classe NSProgress con supporto dell’osservazione KVO. L’app può mostrare un indicatore di caricamento all’utente durante il download delle risorse. Al completamento del download, le risorse sono disponibili nel bundle principale dell’app tramite i meccanismi standard FileManager e NSDataAsset.
Le quote ODR dipendono dalla versione di iOS. A partire da iOS 13, un dispositivo può memorizzare fino a 20 GB di risorse su richiesta per account. Questo spazio è condiviso tra tutte le app installate sul dispositivo — se un’app occupa molto spazio, ne rimane meno per le altre.
Il monitoraggio dello spazio utilizzato viene effettuato tramite NSBundleResourceRequest. L’app può controllare l’archiviazione ODR disponibile e decidere di conseguenza quali risorse caricare per prime. Si consiglia di implementare un meccanismo di fallback: se l’archiviazione ODR è piena, utilizzare risorse di qualità ridotta dal bundle principale.
Quando la quota viene superata, il sistema rimuove le risorse con tag su richiesta nell’ordine del meno recentemente utilizzato, a partire dalle più vecchie. Il gestore delle risorse nel codice dell’app può tracciare l’uso corrente dell’archiviazione ODR tramite la proprietà NSBundleResourceRequest.Gli sviluppatori devono considerare che iOS può decidere in qualsiasi momento di eliminare le risorse su richiesta — l’app deve gestire correttamente le situazioni in cui una risorsa precedentemente caricata diventa improvvisamente non disponibile. Si consiglia di intercettare gli errori di accesso alle risorse e di richiederle nuovamente tramite beginAccessingResources. Per le risorse critiche senza le quali l’app non può funzionare, utilizzare i tag di installazione iniziale che non vengono rimossi dal sistema.
On-Demand Resources offrono allo sviluppatore uno strumento flessibile per gestire la dimensione dell’app, ma impongono una serie di limitazioni legate alla disponibilità della rete e alle politiche di archiviazione di iOS.
Il principale vantaggio di ODR è la riduzione radicale della dimensione dell’installazione iniziale. I giochi con più livelli, le app con contenuti video o grandi set di immagini possono caricare i contenuti in porzioni. L’utente ottiene l’accesso alle funzionalità di base immediatamente, mentre le risorse aggiuntive vengono scaricate in background.
ODR richiede una connessione Internet costante per caricare le risorse al primo accesso. Gli utenti in aree con copertura scarsa possono riscontrare ritardi ed errori di download. Inoltre, Apple non garantisce che le risorse scaricate rimangano sul dispositivo — quando lo spazio è insufficiente, iOS può eliminare i tag su richiesta senza preavviso.
Domande frequenti
ODR consente di aggiungere e modificare risorse senza pubblicare una nuova versione sull’App Store. Basta aggiornare i file sul server Apple tramite Xcode e assegnarli agli stessi tag. Alla richiesta successiva, l’app riceverà la versione più recente della risorsa. Questo è utile per contenuti stagionali, promozioni temporanee e test A/B di nuove immagini e layout.
Il sistema elimina le risorse con tag su richiesta quando deve liberare spazio per altre app. Le risorse dei tag di installazione iniziale non vengono eliminate. L’ordine di eliminazione è determinato dall’algoritmo LRU (Least Recently Used) — le prime a essere eliminate sono le risorse a cui non si è acceduto da più tempo.
A partire da iOS 13, il limite totale di archiviazione ODR è di 20 GB per utente Apple ID. La dimensione di un singolo tag non deve superare 512 MB per prestazioni di download ottimali. Quando il limite viene superato, le richieste falliscono con NSBundleResourceRequestLowDiskSpaceError.
Sì, dopo il download, la risorsa viene salvata nella cache locale ed è disponibile in modalità offline senza connessione Internet. I problemi sorgono solo se iOS ha eliminato la risorsa a causa della mancanza di spazio e l’utente tenta di accedervi senza rete.
ODR è integrato con l’infrastruttura dell’App Store: le risorse sono ospitate sulla CDN Apple, gestite dal sistema di caching e non richiedono allo sviluppatore di configurare un proprio server. URLSession richiede infrastruttura server, controllo versione e gestione manuale della cache. ODR gestisce anche automaticamente la ripresa del download in caso di interruzione della connessione.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche