Caches Directory è una directory nella sandbox dell’applicazione iOS progettata per memorizzare dati temporanei che possono essere ripristinati o ricaricati dalla rete. Secondo Apple File System Basics (2024), il sistema può eliminare i file dal Caches Directory in qualsiasi momento per liberare spazio su disco. L’applicazione deve gestire correttamente l’assenza di questi file e ripristinarli quando necessario. A differenza del Documents Directory, i dati di Caches non sono inclusi nei backup di iCloud e iTunes, riducendo il carico sull’archiviazione cloud dell’utente.
Punti Chiave
Caches Directory è una directory all’interno del sandbox dell’applicazione iOS ottimizzata per memorizzare dati che possono essere ripristinati quando necessario. A differenza del Documents Directory, Caches non è destinato ai dati utente, ma è un archivio temporaneo per accelerare le prestazioni dell’applicazione.
iOS utilizza il Caches Directory per memorizzare risposte di rete memorizzate nella cache, immagini precaricate, oggetti serializzati e dati che l’applicazione può ripristinare. Gli sviluppatori non devono fare affidamento sull’archiviazione a lungo termine in questa directory.
Secondo Apple WWDC 2020, circa il 40% delle applicazioni iOS utilizza il Caches Directory per memorizzare immagini e dati di rete nella cache, mentre il 25% degli sviluppatori inserisce erroneamente in Caches dati che dovrebbero trovarsi in Documents o Application Support per non aver compreso le differenze tra queste directory.
Una proprietà critica di Caches: l’applicazione deve gestire correttamente le situazioni in cui un file della cache è stato eliminato dal sistema. Se la rimozione della cache compromette le funzionalità dell’applicazione, allora i dati sono archiviati nella directory sbagliata.
In Swift, il percorso del Caches Directory si ottiene utilizzando il metodo standard di FileManager con .cachesDirectory. È un’operazione semplice utilizzata in praticamente ogni applicazione iOS che lavora con dati di rete.
import Foundation
let fileManager = FileManager.default
guard let cachesURL = fileManager.urls(
for: .cachesDirectory,
in: .userDomainMask
).first else { return }
// Save cached JSON
let cacheFile = cachesURL.appendingPathComponent("feed_cache.json")
let jsonData = try JSONSerialization.data(
withJSONObject: response,
options: [.prettyPrinted]
)
try jsonData.write(to: cacheFile)
Objective-C utilizza NSSearchPathForDirectoriesInDomains con NSCachesDirectory. Sebbene Apple raccomandi l’API Swift, il codice Objective-C con Caches Directory rimane funzionante e supportato.
@import Foundation;
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSCachesDirectory,
NSUserDomainMask,
YES
);
NSString *cachesPath = paths.firstObject;
NSString *cacheFile = [cachesPath stringByAppendingPathComponent:@"feed_cache.plist"];
I progetti Swift dovrebbero preferire l’API basata su URL: è type-safe e si integra meglio con framework moderni come SwiftUI e Combine.
Caches Directory è ottimale per diverse categorie di dati che l’applicazione utilizza per accelerare le prestazioni, ma non è l’unica fonte di verità. Scegliere i dati giusti per la cache influisce direttamente sull’UX e sulle prestazioni dell’applicazione.
Risposte JSON dalle API, dati dei feed di notizie, elenchi di oggetti. Tutto ciò che l’applicazione può scaricare nuovamente dal server. Utilizza URLCache per la memorizzazione automatica nella cache delle risposte HTTP o salva manualmente gli oggetti serializzati.
Le immagini scaricate dalla rete sono il caso d’uso più comune del Caches Directory. Librerie come SDWebImage e Kingfisher salvano le immagini memorizzate nella cache in Caches per impostazione predefinita.
| Tipo di dato | Adatto per Caches | Periodo di conservazione |
|---|---|---|
| JSON risposte API | Sì | Fino alla pulizia del sistema |
| Immagini dalla rete | Sì | Fino alla pulizia del sistema |
| Log di debug | Condizionale | Meglio in tmp |
| Salvataggi di giochi | No | Solo Documents |
| Configurazioni app | No | Application Support |
Se i dati non possono essere ripristinati, non appartengono a Caches. Questo è il criterio più semplice: immagina che domani il sistema elimini tutti i file da Caches. Se l’applicazione continua a funzionare correttamente, i dati sono archiviati correttamente.
iOS gestisce automaticamente la pulizia del Caches Directory, ma i trigger e gli algoritmi esatti non sono documentati da Apple. È noto che il sistema può eliminare file da Caches quando lo spazio su disco è scarso, così come quando la funzione Offload Unused Apps è attiva.
Il processo di pulizia è trasparente per l’applicazione: il sistema elimina i file senza notifica. L’applicazione deve verificare l’esistenza del file prima di leggerlo e ricrearlo se assente. Non fare affidamento sull’archiviazione a lungo termine è un requisito fondamentale quando si lavora con Caches.
Secondo l’articolo di Apple “File System Basics” (2024), l’applicazione non deve aspettarsi che i file nel Caches Directory siano disponibili tra sessioni diverse. Si raccomanda agli sviluppatori di implementare un meccanismo di fallback: se un file nella cache è mancante, scarica i dati dalla rete e salvali nuovamente in Caches.
Uno scenario separato è lo scaricamento dell’applicazione (Offload). Quando questa funzione viene attivata, iOS rimuove l’applicazione ma conserva il suo Documents Directory. Il Caches Directory viene eliminato nel processo. Un utente che ripristina l’applicazione non avrà dati nella cache. L’applicazione deve scaricarli nuovamente.
La differenza tra le directory Caches e Temporary (tmp) spesso causa confusione tra gli sviluppatori. Entrambe le directory archiviano dati temporanei, ma con diverse garanzie di durata e scopi.
| Caratteristica | Caches Directory | Temporary Directory |
|---|---|---|
| Durata | Da sessione a sessione (non garantita) | Solo all’interno di una sessione |
| Pulizia del sistema | Quando lo spazio è scarso | Al termine della sessione o al riavvio |
| Scopo | Cache per accelerare le prestazioni | Dati molto temporanei |
| Esempio | Immagini nella cache | File temporaneo prima dell’esportazione |
| Backup | No | No |
Scegli Caches se è utile conservare i dati tra gli avvii dell’applicazione ma possono essere ripristinati. Usa tmp se i dati sono necessari solo nella sessione corrente e non hanno valore dopo la chiusura dell’applicazione.
Lavorare con il Caches Directory richiede il rispetto di diverse regole che aiutano a evitare la perdita di dati, comportamenti imprevisti dell’applicazione e problemi di prestazioni.
FileManager.fileExists(atPath:) deve essere chiamato prima di ogni lettura da Caches. Se il file è mancante, carica i dati dalla fonte originale e salvali nella cache. Non presumere mai che un file in Caches esista.
Imposta una dimensione massima per il Caches Directory nella tua applicazione. Ad esempio, un limite di 50 MB per le immagini e 10 MB per le risposte JSON. Quando il limite viene superato, elimina i file più vecchi per data di modifica.
import Foundation
func trimCache(to maxSizeBytes: Int) {
let cachesURL = FileManager.default
.urls(for: .cachesDirectory, in: .userDomainMask)
.first!
guard let enumerator = FileManager.default
.enumerator(
at: cachesURL,
includingPropertiesForKeys: [.fileSizeKey, .contentModificationDateKey]
)
else { return }
// Enumerate and remove old files
// when exceeding size limit
}
Seguire queste buone pratiche garantisce che l’applicazione funzioni correttamente indipendentemente dalle azioni di pulizia della cache del sistema e che gli utenti non subiscano perdite impreviste di dati.
Domande Frequenti
No, iOS non invia notifiche prima di eliminare file da Caches. Il processo di pulizia è completamente trasparente per l’applicazione. L’unico modo per scoprire un’eliminazione è quando si tenta di leggere un file. FileManager restituisce nil o genera un errore, e l’applicazione deve gestire questa situazione.
Gli utenti non hanno accesso diretto al Caches Directory tramite Files o iTunes. Tuttavia, possono pulire la cache di tutte le applicazioni tramite Impostazioni > Generali > Archiviazione, selezionare un’applicazione specifica e toccare “Scarica App.” iOS può anche pulire automaticamente la cache quando lo spazio è scarso.
URLCache è un meccanismo integrato di caching delle richieste HTTP di Foundation. Salva e carica automaticamente le risposte nella cache, utilizzando internamente il Caches Directory. Il salvataggio manuale offre maggiore controllo: puoi scegliere il formato, crittografare i dati e gestire la durata di ogni file individualmente.
Durante l’aggiornamento dell’applicazione tramite l’App Store, il Caches Directory viene conservato. Tuttavia, il contenuto può essere eliminato dal sistema se il nuovo aggiornamento richiede più spazio per l’installazione. Lo sviluppatore non deve fare affidamento sulla persistenza di Caches dopo un aggiornamento. Questo è un motivo aggiuntivo per implementare un meccanismo di fallback.
Imposta URLCache su nil per una sessione NSURLSession specifica o utilizza la politica di cache .reloadIgnoringLocalCacheData. Puoi anche creare una URLSessionConfiguration con cache vuota: sessionConfiguration.urlCache = nil. Questo è utile per i dati che devono essere sempre aggiornati.
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