Documents Directory — je adresář v sandboxu aplikace iOS, určený pro ukládání uživatelských dat, která mají být zachována mezi relacemi aplikace a přístupná uživateli prostřednictvím iTunes File Sharing a iCloud. Podle Apple File System Programming Guide (2024) je obsah tohoto adresáře automaticky zahrnut do zálohy iCloud a iTunes, proto vývojář musí vědomě volit, jaká data umístit do Documents. Na rozdíl od Caches Directory nejsou soubory v Documents systémem odstraňovány při nedostatku místa — odpovědnost za správu velikosti leží na aplikaci.
Hlavní body
Documents Directory — je adresář uvnitř sandboxu aplikace iOS, určený pro ukládání uživatelských dat, která mají být zachována mezi spuštěními a přístupná uživateli. Každá aplikace získává vlastní izolovaný sandbox a Documents je jedním z klíčových adresářů vedle Caches, tmp a Library.
iOS používá přísný sandbox: aplikace nemá přístup k souborovému systému jiných aplikací a systémovým adresářům bez zvláštních oprávnění. Documents Directory — jediný adresář, jehož obsah může uživatel prohlížet prostřednictvím iTunes File Sharing (při zapnutí příslušného klíče UIFileSharingEnabled v Info.plist).
Podle údajů Apple WWDC 2023 používá více než 85% aplikací v App Store Documents Directory k ukládání alespoň jednoho typu uživatelských dat — od exportovaných PDF po uložené herní soubory a exportované obrázky.
Vývojář musí pochopit: soubory v Documents jsou automaticky zahrnuty do zálohy iCloud a iTunes. Pokud aplikace ukládá do Documents velké objemy dat, která lze obnovit (například mezipaměť obrázků nebo dočasné soubory), povede to k neodůvodněnému zabírání místa v úložišti iCloud uživatele.
Ve Swift se cesta k Documents Directory získává pomocí FileManager. Apple doporučuje používat API založené na URL místo API založeného na řetězci pro lepší kompatibilitu s moderními možnostmi iOS.
import Foundation
let fileManager = FileManager.default
guard let documentsURL = fileManager.urls(
for: .documentDirectory,
in: .userDomainMask
).first else { return }
// Vytvořit soubor v Documents
let fileURL = documentsURL.appendingPathComponent("report.pdf")
let data = Data("Hello, world!".utf8)
try data.write(to: fileURL)
Objective-C používá NSSearchPathForDirectoriesInDomains — starší, ale stále podporovaný přístup, který vrací řetězcovou cestu místo URL.
@import Foundation;
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory,
NSUserDomainMask,
YES
);
NSString *documentsPath = paths.firstObject;
NSString *filePath = [documentsPath stringByAppendingPathComponent:@"report.pdf"];
Moderní projekty ve Swift by měly používat FileManager.urls, protože tato metoda vrací URL, nikoli řetězec, což snižuje riziko chyb s kódováním cest a činí kód typově bezpečnějším.
Documents Directory je určena pro data vytvořená uživatelem nebo potřebná uživateli v explicitní podobě. Apple zdůrazňuje několik kategorií, které jsou pro tento adresář vhodné.
Soubory, které uživatel vytváří nebo importuje — textové dokumenty, PDF, obrázky, exportované zprávy, zálohovací soubory. Tato data mají pro uživatele přímou hodnotu a jejich ztráta by byla kritická.
Uložené hry, soubory stavu aplikace, exportované projekty — vše, co uživatel očekává obnovit po přeinstalování aplikace. Pro kritická data se však doporučuje také používat iCloud Key-Value Storage nebo Core Data se synchronizací iCloud.
| Typ dat | Vhodné pro Documents | Alternativa |
|---|---|---|
| PDF a textové dokumenty | Ano | — |
| Mezipaměť obrázků | Ne | Caches Directory |
| Uložené hry | Ano | iCloud KVS |
| Protokoly a data pro ladění | Ne | Caches nebo tmp |
| Exportované zprávy | Ano | — |
Klíčové kritérium: pokud lze data obnovit ze sítě nebo znovu vytvořit — jejich místo je v Caches, nikoli v Documents. Každý gigabajt v Documents je gigabajt v záloze iCloud uživatele.
iOS automaticky zahrnuje obsah Documents Directory do zálohy při připojení zařízení k iTunes nebo při synchronizaci s iCloud. Toto chování nelze vypnout na úrovni adresáře — pouze po souborech pomocí atributu NSURLIsExcludedFromBackupKey.
Od iOS 5.0 začala Apple odmítat aplikace, které ukládají do Documents velké objemy obnovitelných dat. Doporučení Apple: soubory, které lze znovu stáhnout, by měly být uloženy v Caches Directory s příznakem vyloučení ze zálohy.
import Foundation
let documentsURL = FileManager.default
.urls(for: .documentDirectory, in: .userDomainMask)
.first!
// Vyloučit soubor ze zálohy iCloud
var resourceValues = URLResourceValues()
resourceValues.isExcludedFromBackup = true
var fileURL = documentsURL.appendingPathComponent("cached_data.json")
try fileURL.setResourceValues(resourceValues)
Synchronizace iCloud funguje prostřednictvím NSUbiquitousContainer, pokud aplikace používá iCloud Documents. V tomto případě jsou soubory z Documents Directory automaticky synchronizovány mezi zařízeními uživatele. Pro aplikace bez iCloud je synchronizace omezena na zálohování.
Rozdíl mezi Documents a Caches — jeden z nejčastějších omylů mezi začínajícími iOS vývojáři. Hlavní rozdíl: systém může kdykoli odstranit soubory z Caches pro uvolnění místa, ale nikdy nesahá do Documents bez vědomí uživatele.
| Charakteristika | Documents Directory | Caches Directory |
|---|---|---|
| Záloha iCloud | Ano (výchozí) | Ne |
| Odstranění systémem | Nikdy | Při nedostatku místa |
| iTunes File Sharing | Ano (při zapnutí příznaku) | Ne |
| Účel | Uživatelská data | Mezipaměť, dočasná data |
| Obnovení dat | Vyžaduje obnovení | Lze znovu stáhnout ze sítě |
Podle Apple Developer Documentation (2024) je nesprávné používání Documents Directory — jednou z častých příčin odmítnutí aplikací při recenzi: pokud aplikace ukládá do Documents více než několik megabajtů obnovitelných dat, Apple doporučuje je přesunout do Caches nebo použít NSURLIsExcludedFromBackupKey.
Praktické pravidlo: pokud bude uživatel smutný ze ztráty souboru — ukládej do Documents. Pokud lze soubor znovu stáhnout nebo vygenerovat — ukládej do Caches.
Zkušení iOS vývojáři vytvořili několik pravidel, která pomáhají vyhnout se problémům s Documents Directory ve všech fázích životního cyklu aplikace — od vývoje po publikování v App Store.
Pravidelně kontroluj velikost Documents Directory pomocí FileManager.enumerator(at:includingPropertiesForKeys:). Pokud velikost přesahuje 100 MB pro data, která nejsou uživatelská — je to důvod k přehodnocení architektury úložiště.
Pro všechny soubory, které lze znovu stáhnout ze sítě, nastav isExcludedFromBackup = true. To sníží zatížení úložiště iCloud uživatele a sníží riziko odmítnutí aplikace App Review.
Při změně formátu dat v Documents počítej s migrací: neodstraňuj staré soubory, dokud si nejsi jistý, že nové byly správně vytvořeny. Používej podadresáře specifické pro verzi.
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
)
Dodržování těchto postupů snižuje riziko ztráty uživatelských dat, zmenšuje velikost zálohy iCloud a usnadňuje průchod recenzí v App Store.
Často kladené otázky
Ano, prostřednictvím Files — vestavěné aplikace iOS od verze 11. Při zapnutí klíče UIFileSharingEnabled v Info.plist se obsah Documents Directory zobrazí v aplikaci Soubory v sekci „Na mém iPhonu“. Uživatel může soubory prohlížet, kopírovat a mazat.
Celý sandbox aplikace, včetně Documents Directory, Caches, tmp a Library, je zcela odstraněn ze zařízení. Zálohy v iCloud zůstávají až do obnovení nebo ručního smazání. Při přeinstalaci aplikace začíná s čistým sandboxem.
Použij FileManager.enumerator k procházení všech souborů v adresáři a sečtení jejich velikostí. Pro každý soubor získej atribut .fileSize pomocí resourceValues(forKeys:). Alternativně použij URLResourceKey.fileSizeKey a .directoryEnumerationResults.
Ve výchozím nastavení Core Data vytváří soubor SQLite v Library/Application Support, nikoli v Documents. Přesun databáze do Documents se nedoporučuje — bude zahrnuta do iTunes File Sharing a uživatel ji může náhodně smazat nebo upravit. Výjimka: pokud aplikace výslovně poskytuje uživateli přístup k datům prostřednictvím Core Data.
UIFileSharingEnabled (Application supports iTunes file sharing) — booleovský klíč v Info.plist. Při nastavení na YES může uživatel kopírovat soubory z Documents Directory prostřednictvím iTunes a Files. Přidej klíč do Info.plist: UIFileSharingEnabled = YES. Zapínej pouze pokud aplikace skutečně vytváří uživatelské dokumenty.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také