Documents Directory — este un director în sandbox-ul aplicației iOS, destinat stocării datelor utilizatorului care trebuie păstrate între sesiunile aplicației și să fie accesibile utilizatorului prin iTunes File Sharing și iCloud. Conform Apple File System Programming Guide (2024), conținutul acestui director este inclus automat în backup-ul iCloud și iTunes, deci dezvoltatorul trebuie să aleagă în cunoștință de cauză ce date să plaseze în Documents. Spre deosebire de Caches Directory, fișierele din Documents nu sunt șterse de sistem când spațiul este insuficient — responsabilitatea gestionării dimensiunii revine aplicației.
Principalele
Documents Directory — este un director întân sandbox-ul aplicației iOS, destinat stocării datelor utilizatorului care trebuie păstrate între rulări și accesibile utilizatorului. Fiecare aplicație primește propriul sandbox izolat, iar Documents este unul dintre directoarele cheie alături de Caches, tmp și Library.
iOS folosește un sandbox strict: aplicația nu are acces la sistemul de fișiere al altor aplicații și la directoarele sistemului fără permisiuni speciale. Documents Directory — singurul director al cărui conținut poate fi vizualizat de utilizator prin iTunes File Sharing (la activarea cheii corespunzătoare UIFileSharingEnabled în Info.plist).
Conform datelor Apple WWDC 2023, peste 85% din aplicațiile din App Store folosesc Documents Directory pentru a stoca cel puțin un tip de date ale utilizatorului — de la PDF-uri exportate la fișiere de joc salvate și imagini exportate.
Dezvoltatorul trebuie să înțeleagă: fișierele din Documents sunt incluse automat în backup-ul iCloud și iTunes. Dacă aplicația stochează în Documents volume mari de date care pot fi restaurate (de exemplu, cache de imagini sau fișiere temporare), aceasta va duce la o ocupare nejustificată a spațiului în stocarea iCloud a utilizatorului.
În Swift, calea către Documents Directory se obține prin FileManager. Apple recomandă utilizarea API-ului bazat pe URL în loc de string-based pentru o mai bună compatibilitate cu capacitățile moderne ale iOS.
import Foundation
let fileManager = FileManager.default
guard let documentsURL = fileManager.urls(
for: .documentDirectory,
in: .userDomainMask
).first else { return }
// Creează fișier în Documents
let fileURL = documentsURL.appendingPathComponent("report.pdf")
let data = Data("Hello, world!".utf8)
try data.write(to: fileURL)
Objective-C folosește NSSearchPathForDirectoriesInDomains — o abordare mai veche, dar încă suportată, care returnează o cale sub formă de șir în loc de URL.
@import Foundation;
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory,
NSUserDomainMask,
YES
);
NSString *documentsPath = paths.firstObject;
NSString *filePath = [documentsPath stringByAppendingPathComponent:@"report.pdf"];
Proiectele moderne în Swift ar trebui să folosească FileManager.urls, deoarece această metodă returnează un URL, nu un șir, ceea ce reduce riscul de erori de codificare a căilor și face codul mai sigur din punct de vedere al tipurilor.
Documents Directory este destinată datelor create de utilizator sau necesare utilizatorului în formă explicită. Apple evidențiază mai multe categorii care sunt potrivite pentru acest director.
Fișierele pe care utilizatorul le creează sau le importă — documente text, PDF, imagini, rapoarte exportate, fișiere de backup. Aceste date au valoare directă pentru utilizator, iar pierderea lor ar fi critică.
Salvările de jocuri, fișierele de stare ale aplicației, proiectele exportate — tot ceea ce utilizatorul se așteaptă să restabilească după reinstallarea aplicației. Cu toate acestea, pentru datele critice se recomandă utilizarea suplimentară a iCloud Key-Value Storage sau Core Data cu sincronizare iCloud.
| Tip de date | Potrivit pentru Documents | Alternativă |
|---|---|---|
| PDF și documente text | Da | — |
| Cache de imagini | Nu | Caches Directory |
| Salvări de jocuri | Da | iCloud KVS |
| Loguri și date de debug | Nu | Caches sau tmp |
| Rapoarte exportate | Da | — |
Criteriul cheie: dacă datele pot fi restaurate din rețeaua sau recreate — locul lor este în Caches, nu în Documents. Fiecare gigaoctet în Documents este un gigaoctet în backup-ul iCloud al utilizatorului.
iOS include automat conținutul Documents Directory în backup la conectarea dispozitivului la iTunes sau la sincronizarea cu iCloud. Acest comportament nu poate fi dezactivat la nivel de director — doar fișier cu fișier prin atributul NSURLIsExcludedFromBackupKey.
Începând cu iOS 5.0, Apple a început să respingă aplicațiile care stochează în Documents volume mari de date care pot fi restaurate. Recomandarea Apple: fișierele care pot fi descărcate din nou trebuie stocate în Caches Directory cu flag de excludere din backup.
import Foundation
let documentsURL = FileManager.default
.urls(for: .documentDirectory, in: .userDomainMask)
.first!
// Exclude fișierul din backup-ul iCloud
var resourceValues = URLResourceValues()
resourceValues.isExcludedFromBackup = true
var fileURL = documentsURL.appendingPathComponent("cached_data.json")
try fileURL.setResourceValues(resourceValues)
Sincronizarea iCloud funcționează prin NSUbiquitousContainer dacă aplicația folosește iCloud Documents. În acest caz, fișierele din Documents Directory sunt sincronizate automat între dispozitivele utilizatorului. Pentru aplicațiile fără iCloud, sincronizarea se limitează la backup.
Diferența dintre Documents și Caches — una dintre cele mai frecvente confuzii între dezvoltatorii iOS începători. Diferența principală: sistemul poate șterge în orice moment fișierele din Caches pentru a elibera spațiu, dar nu atinge niciodată Documents fără știrea utilizatorului.
| Caracteristică | Documents Directory | Caches Directory |
|---|---|---|
| Backup în iCloud | Da (implicit) | Nu |
| Ștergere de sistem | Niciodată | La lipsă de spațiu |
| iTunes File Sharing | Da (la activare flag) | Nu |
| Scop | Date ale utilizatorului | Cache, date temporare |
| Restaurare date | Necesită restaurare | Poate fi re-descărcat din rețeaua |
Conform Apple Developer Documentation (2024), utilizarea incorectă a Documents Directory — una dintre cauzele frecvente de respingere a aplicațiilor la review: dacă aplicația stochează în Documents mai mult de câțiva megaocteți de date care pot fi restaurate, Apple recomandă mutarea lor în Caches sau aplicarea NSURLIsExcludedFromBackupKey.
Regulă practică: dacă utilizatorul va fi întristat la pierderea fișierului — stochează în Documents. Dacă fișierul poate fi re-descărcat sau generat — stochează în Caches.
Dezvoltatorii iOS experimentați au elaborat câteva reguli care ajută la evitarea problemelor cu Documents Directory în toate etapele ciclului de viață al aplicației — de la dezvoltare la publicare în App Store.
Verifică regulat dimensiunea Documents Directory prin FileManager.enumerator(at:includingPropertiesForKeys:). Dacă dimensiunea depășește 100 MB pentru date care nu sunt ale utilizatorului — acesta este un motiv pentru a reconsidera arhitectura de stocare.
Pentru toate fișierele care pot fi re-descărcate din rețeaua, setează isExcludedFromBackup = true. Aceasta reduce încărcarea asupra stocării iCloud a utilizatorului și scade riscul de respingere a aplicației de către App Review.
La modificarea formatului de date în Documents, prevede migrarea: nu șterge fișierele vechi până nu te asiguri că cele noi au fost create corect. Folosește subdirectoare specifice versiunii.
import Foundation
let documentsURL = FileManager.default
.urls(for: .documentDirectory, in: .userDomainMask)
.first!
let versionDir = documentsURL.appendingPathComponent("v2")
try FileManager.default.createDirectory(
at: versionDir,
withIntermediateDirectories: true
)
Respectarea acestor practici reduce riscul de pierdere a datelor utilizatorului, micșorează dimensiunea backup-ului iCloud și facilitează trecerea review-ului în App Store.
Întrebări frecvente
Da, prin Files — aplicația integrată iOS începând cu versiunea 11. La activarea cheii UIFileSharingEnabled în Info.plist, conținutul Documents Directory este afișat în aplicația Fișiere în secțiunea „Pe iPhone-ul meu“. Utilizatorul poate vizualiza, copia și șterge fișiere.
Întregul sandbox al aplicației, inclusiv Documents Directory, Caches, tmp și Library, este complet șters de pe dispozitiv. Backup-urile în iCloud rămân până la restaurare sau ștergere manuală. La reinstallare, aplicația începe cu un sandbox curat.
Folosește FileManager.enumerator pentru a parcurge toate fișierele din director și a suma dimensiunile lor. Pentru fiecare fișier, obține atributul .fileSize prin resourceValues(forKeys:). Alternativ, folosește URLResourceKey.fileSizeKey și .directoryEnumerationResults.
Implicit, Core Data creează fișierul SQLite în Library/Application Support, nu în Documents. Mutarea bazei în Documents nu este recomandată — va fi inclusă în iTunes File Sharing și utilizatorul o poate șterge sau modifica accidental. Excepție: dacă aplicația oferă explicit utilizatorului acces la date prin Core Data.
UIFileSharingEnabled (Application supports iTunes file sharing) — o cheie booleană în Info.plist. La setarea YES, utilizatorul poate copia fișiere din Documents Directory prin iTunes și Files. Adaugă cheia în Info.plist: UIFileSharingEnabled = YES. Activează numai dacă aplicația creează într-adevăr documente ale utilizatorului.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și