Documents Directory — är en katalog i iOS-applikationens sandlåda, avsedd för lagring av användardata som måste bevaras mellan applikationens sessioner och vara tillgängliga för användaren via iTunes File Sharing och iCloud. Enligt Apple File System Programming Guide (2024) inkluderas innehållet i denna katalog automatiskt i iCloud- och iTunes-säkerhetskopian, så utvecklaren måste medvetet välja vilka data som ska placeras i Documents. Till skillnad från Caches Directory tas filer i Documents inte bort av systemet när det är brist på utrymme — ansvaret för storlekshantering ligger på applikationen.
Huvudpunkter
Documents Directory — är en katalog inuti iOS-applikationens sandlåda, avsedd för lagring av användardata som måste bevaras mellan körningar och vara tillgängliga för användaren. Varje applikation får sin egen isolerade sandlåda, och Documents är en av nyckelkatalogerna tillsammans med Caches, tmp och Library.
iOS använder en strikt sandlåda: applikationen har inte åtkomst till andra applikationers filsystem och systemkataloger utan särskilda behörigheter. Documents Directory — den enda katalog vars innehåll användaren kan visa via iTunes File Sharing (när motsvarande nyckel UIFileSharingEnabled aktiveras i Info.plist).
Enligt data från Apple WWDC 2023 använder över 85% av applikationerna i App Store Documents Directory för att lagra åtminstone en typ av användardata — från exporterade PDF-filer till sparade spelfiler och exporterade bilder.
Utvecklaren måste förstå: filer i Documents inkluderas automatiskt i iCloud- och iTunes-säkerhetskopian. Om applikationen lagrar stora mängder återställningsbara data i Documents (till exempel bildcache eller temporära filer), kommer detta att leda till oberättigad förbrukning av utrymme i användarens iCloud-lagring.
I Swift erhålls sökvägen till Documents Directory via FileManager. Apple rekommenderar att använda URL-baserat API istället för strängbaserat för bättre kompatibilitet med moderna iOS-funktioner.
import Foundation
let fileManager = FileManager.default
guard let documentsURL = fileManager.urls(
for: .documentDirectory,
in: .userDomainMask
).first else { return }
// Skapa fil i Documents
let fileURL = documentsURL.appendingPathComponent("report.pdf")
let data = Data("Hello, world!".utf8)
try data.write(to: fileURL)
Objective-C använder NSSearchPathForDirectoriesInDomains — ett äldre men fortfarande understött tillvägagångssätt som returnerar en strängväg istället för en URL.
@import Foundation;
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory,
NSUserDomainMask,
YES
);
NSString *documentsPath = paths.firstObject;
NSString *filePath = [documentsPath stringByAppendingPathComponent:@"report.pdf"];
Moderna projekt i Swift bör använda FileManager.urls eftersom denna metod returnerar en URL, inte en sträng, vilket minskar risken för fel med sökvägskodning och gör koden mer typ säker.
Documents Directory är avsedd för data som skapats av användaren eller som användaren behöver i explicit form. Apple framhäver flera kategorier som är lämpliga för denna katalog.
Filer som användaren skapar eller importerar — textdokument, PDF-filer, bilder, exporterade rapporter, säkerhetskopior. Dessa data har direkt värde för användaren, och deras förlust skulle vara kritisk.
Sparade spel, applikationstillståndsfiler, exporterade projekt — allt som användaren förväntar sig att återställa efter ominstallation av applikationen. För kritisk data rekommenderas dock även att använda iCloud Key-Value Storage eller Core Data med iCloud-synkronisering.
| Datatyp | Lämplig för Documents | Alternativ |
|---|---|---|
| PDF och textdokument | Ja | — |
| Cache av bilder | Nej | Caches Directory |
| Sparade spel | Ja | iCloud KVS |
| Loggar och felsökningsdata | Nej | Caches eller tmp |
| Exporterade rapporter | Ja | — |
Nyckelkriterium: om data kan återställas från nätverket eller återskapas — deras plats är i Caches, inte i Documents. Varje gigabyte i Documents är en gigabyte i användarens iCloud-säkerhetskopia.
iOS inkluderar automatiskt innehållet i Documents Directory i säkerhetskopian när enheten ansluts till iTunes eller vid synkronisering med iCloud. Detta beteende kan inte inaktiveras på katalognivå — endast fil för fil via attributet NSURLIsExcludedFromBackupKey.
Från och med iOS 5.0 började Apple avvisa applikationer som lagrar stora mängder återställningsbara data i Documents. Apples rekommendation: filer som kan laddas ner igen bör lagras i Caches Directory med flagga för uteslutning från säkerhetskopian.
import Foundation
let documentsURL = FileManager.default
.urls(for: .documentDirectory, in: .userDomainMask)
.first!
// Exkludera fil från iCloud-säkerhetskopia
var resourceValues = URLResourceValues()
resourceValues.isExcludedFromBackup = true
var fileURL = documentsURL.appendingPathComponent("cached_data.json")
try fileURL.setResourceValues(resourceValues)
iCloud-synkronisering fungerar via NSUbiquitousContainer om applikationen använder iCloud Documents. I så fall synkroniseras filer från Documents Directory automatiskt mellan användarens enheter. För applikationer utan iCloud är synkroniseringen begränsad till säkerhetskopiering.
Skillnaden mellan Documents och Caches — en av de vanligaste missuppfattningarna bland börjande iOS-utvecklare. Huvudskillnaden: systemet kan när som helst ta bort filer från Caches för att frigöra utrymme, men rör aldrig Documents utan användarens vetskap.
| Egenskap | Documents Directory | Caches Directory |
|---|---|---|
| iCloud-säkerhetskopia | Ja (standard) | Nej |
| Borttagning av systemet | Aldrig | Vid brist på utrymme |
| iTunes File Sharing | Ja (när flaggan är aktiverad) | Nej |
| Syfte | Användardata | Cache, temporära data |
| Återställning av data | Kräver återställning | Kan laddas ner igen från nätverket |
Enligt Apple Developer Documentation (2024) är felaktig användning av Documents Directory — en av de vanliga orsakerna till avvisning av applikationer vid granskning: om applikationen lagrar mer än några megabyte återställningsbara data i Documents, rekommenderar Apple att flytta dem till Caches eller tillämpa NSURLIsExcludedFromBackupKey.
Praktisk regel: om användaren blir ledsen över förlusten av filen — lagra i Documents. Om filen kan laddas ner eller genereras igen — lagra i Caches.
Erfarna iOS-utvecklare har utarbetat flera regler som hjälper till att undvika problem med Documents Directory i alla faser av applikationens livscykel — från utveckling till publicering i App Store.
Kontrollera regelbundet storleken på Documents Directory via FileManager.enumerator(at:includingPropertiesForKeys:). Om storleken överstiger 100 MB för data som inte är användardata — är detta en anledning att ompröva lagringsarkitekturen.
För alla filer som kan laddas ner igen från nätverket, ställ in isExcludedFromBackup = true. Detta minskar belastningen på användarens iCloud-lagring och minskar risken för avvisning av applikationen av App Review.
När dataformatet i Documents ändras, förutse migrering: ta inte bort gamla filer förrän du är säker på att nya har skapats korrekt. Använd versionsspecifika underkataloger.
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
)
Att följa dessa metoder minskar risken för förlust av användardata, minskar storleken på iCloud-säkerhetskopian och underlättar granskningsprocessen i App Store.
Vanliga frågor
Ja, via Files — den inbyggda iOS-applikationen från och med version 11. När nyckeln UIFileSharingEnabled aktiveras i Info.plist visas innehållet i Documents Directory i appen Filer i avsnittet „På min iPhone”. Användaren kan visa, kopiera och ta bort filer.
Hela applikationens sandlåda, inklusive Documents Directory, Caches, tmp och Library, tas helt bort från enheten. Säkerhetskopior i iCloud finns kvar tills återställning eller manuell borttagning. Vid ominstallation börjar applikationen med en ren sandlåda.
Använd FileManager.enumerator för att gå igenom alla filer i katalogen och summera deras storlekar. För varje fil, hämta attributet .fileSize via resourceValues(forKeys:). Alternativt, använd URLResourceKey.fileSizeKey och .directoryEnumerationResults.
Som standard skapar Core Data SQLite-filen i Library/Application Support, inte i Documents. Att flytta databasen till Documents rekommenderas inte — den kommer att inkluderas i iTunes File Sharing och användaren kan oavsiktligt ta bort eller ändra den. Undantag: om applikationen uttryckligen ger användaren åtkomst till data via Core Data.
UIFileSharingEnabled (Application supports iTunes file sharing) — en boolesk nyckel i Info.plist. När den ställs in på YES kan användaren kopiera filer från Documents Directory via iTunes och Files. Lägg till nyckeln i Info.plist: UIFileSharingEnabled = YES. Aktivera endast om applikationen faktiskt skapar användardokument.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också