Documents Directory — це директорія в пісочниці iOS-застосунку, призначена для зберігання користувацьких даних, які мають зберігатися між сесіями роботи застосунку та бути доступними користувачеві через iTunes File Sharing і iCloud. За даними Apple File System Programming Guide (2024), вміст цієї директорії автоматично включається в резервне копіювання на iCloud та iTunes, тому розробнику важливо усвідомлено вибирати, які дані розміщувати в Documents. На відміну від Caches Directory, файли в Documents не видаляються системою при нестачі місця — відповідальність за управління розміром лежить на застосунку.
Головне
Documents Directory — це директорія всередині пісочниці iOS-застосунку, призначена для зберігання користувацьких даних, які мають зберігатися між запусками та бути доступними користувачеві. Кожен застосунок отримує власну ізольовану пісочницю, і Documents є однією з ключових директорій поряд із Caches, tmp та Library.
iOS використовує строгу пісочницю (sandbox): застосунок не має доступу до файлової системи інших застосунків та до системних директорій без спеціальних дозволів. Documents Directory — єдина директорія, вміст якої користувач може переглядати через iTunes File Sharing (при включенні відповідного ключа UIFileSharingEnabled в Info.plist).
За даними Apple WWDC 2023, понад 85% застосунків в App Store використовують Documents Directory для зберігання хоча б одного типу користувацьких даних — від експортованих PDF до збережених ігрових файлів та експортованих зображень.
Розробнику важливо розуміти: файли в Documents автоматично включаються в резервне копіювання на iCloud та iTunes. Якщо застосунок зберігає в Documents великі обсяги даних, які можна відновити (наприклад, кеш зображень або тимчасові файли), це призведе до невиправданої витрати місця в iCloud-сховищі користувача.
У Swift шлях до Documents Directory отримується через FileManager. Apple рекомендує використовувати URL-орієнтований API замість рядкового для кращої сумісності з сучасними можливостями iOS.
import Foundation
let fileManager = FileManager.default
guard let documentsURL = fileManager.urls(
for: .documentDirectory,
in: .userDomainMask
).first else { return }
// Створити файл в Documents
let fileURL = documentsURL.appendingPathComponent("report.pdf")
let data = Data("Hello, world!".utf8)
try data.write(to: fileURL)
Objective-C використовує NSSearchPathForDirectoriesInDomains — старіший, але все ще підтримуваний підхід, який повертає рядковий шлях замість URL.
@import Foundation;
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory,
NSUserDomainMask,
YES
);
NSString *documentsPath = paths.firstObject;
NSString *filePath = [documentsPath stringByAppendingPathComponent:@"report.pdf"];
Сучасні проєкти на Swift мають використовувати FileManager.urls, оскільки цей метод повертає URL, а не рядок, що знижує ризик помилок із кодуванням шляхів та робить код більш типобезпечним.
Documents Directory призначена для даних, створених користувачем або необхідних користувачеві в явному вигляді. Apple виділяє кілька категорій, які доречно розміщувати в цій директорії.
Файли, які користувач створює або імпортує — текстові документи, PDF, зображення, експортовані звіти, файли резервних копій. Ці дані мають пряму цінність для користувача, і їхня втрата була б критичною.
Сейви ігор, файли стану застосунку, експортовані проєкти — все, що користувач очікує відновити після перевстановлення застосунку. Однак для критичних даних рекомендується додатково використовувати iCloud Key-Value Storage або Core Data з iCloud sync.
| Тип даних | Підходить для Documents | Альтернатива |
|---|---|---|
| PDF та текстові документи | Так | — |
| Кеш зображень | Ні | Caches Directory |
| Сейви ігор | Так | iCloud KVS |
| Логи та налагоджувальні дані | Ні | Caches або tmp |
| Експортовані звіти | Так | — |
Ключовий критерій: якщо дані можна відновити з мережі або перестворити — їм місце в Caches, а не в Documents. Кожен гігабайт в Documents — це гігабайт в iCloud-бекапі користувача.
iOS автоматично включає вміст Documents Directory в резервне копіювання при підключенні пристрою до iTunes або при синхронізації з iCloud. Цю поведінку не можна вимкнути на рівні директорії — тільки пофайлово через атрибут NSURLIsExcludedFromBackupKey.
Починаючи з iOS 5.0, Apple почала відхиляти застосунки, які зберігають в Documents великі обсяги даних, що підлягають відновленню. Рекомендація Apple: файли, які можна завантажити заново, мають зберігатися в Caches Directory з прапорцем виключення з бекапу.
import Foundation
let documentsURL = FileManager.default
.urls(for: .documentDirectory, in: .userDomainMask)
.first!
// Виключити файл з iCloud бекапу
var resourceValues = URLResourceValues()
resourceValues.isExcludedFromBackup = true
var fileURL = documentsURL.appendingPathComponent("cached_data.json")
try fileURL.setResourceValues(resourceValues)
iCloud-синхронізація працює через NSUbiquitousContainer, якщо застосунок використовує iCloud Documents. У цьому випадку файли з Documents Directory автоматично синхронізуються між пристроями користувача. Для застосунків без iCloud синхронізація обмежена резервним копіюванням.
Різниця між Documents та Caches — одна з найпоширеніших помилок серед початківців iOS-розробників. Головна відмінність: система може в будь-який момент видалити файли з Caches для звільнення місця, але ніколи не чіпає Documents без відома користувача.
| Характеристика | Documents Directory | Caches Directory |
|---|---|---|
| Бекап в iCloud | Так (за замовчуванням) | Ні |
| Видалення системою | Ніколи | При нестачі місця |
| iTunes File Sharing | Так (при включенні прапорця) | Ні |
| Призначення | Користувацькі дані | Кеш, тимчасові дані |
| Відновлення даних | Потребує відновлення | Можна перезавантажити з мережі |
За даними Apple Developer Documentation (2024), неправильне використання Documents Directory — одна з частих причин відхилення застосунків на рев'ю: якщо застосунок зберігає в Documents більше кількох мегабайт даних, які можна відновити, Apple рекомендує перемістити їх у Caches або застосувати NSURLIsExcludedFromBackupKey.
Практичне правило: якщо користувач засмутиться при втраті файлу — зберігай в Documents. Якщо файл можна заново завантажити або згенерувати — зберігай в Caches.
Досвідчені iOS-розробники виробили кілька правил, які допомагають уникнути проблем з Documents Directory на всіх етапах життєвого циклу застосунку — від розробки до публікації в App Store.
Регулярно перевіряй розмір Documents Directory через FileManager.enumerator(at:includingPropertiesForKeys:). Якщо розмір перевищує 100 МБ для даних, що не є користувацькими — це привід переглянути архітектуру зберігання.
Для будь-яких файлів, які можна повторно завантажити з мережі, встанови isExcludedFromBackup = true. Це знижує навантаження на iCloud-сховище користувача та зменшує ризик відхилення застосунку App Review.
При зміні формату даних в Documents передбач міграцію: не видаляй старі файли, поки не переконаєшся, що нові коректно створені. Використовуй version-специфічні піддиректорії.
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
)
Дотримання цих практик знижує ризик втрати користувацьких даних, зменшує розмір iCloud-бекапу та спрощує проходження рев'ю в App Store.
Часті запитання
Так, через Files — вбудований застосунок iOS починаючи з версії 11. При включенні ключа UIFileSharingEnabled в Info.plist вміст Documents Directory відображається в застосунку Файли в розділі "На моєму iPhone". Користувач може переглядати, копіювати та видаляти файли.
Вся пісочниця застосунку, включаючи Documents Directory, Caches, tmp та Library, повністю видаляється з пристрою. Резервні копії в iCloud зберігаються до моменту відновлення або ручного видалення. При перевстановленні застосунок починає з чистої пісочниці.
Використовуй FileManager.enumerator для обходу всіх файлів в директорії та підсумовування їхніх розмірів. Для кожного файлу отримай атрибут .fileSize через resourceValues(forKeys:). Альтернативно використовуй URLResourceKey.fileSizeKey та .directoryEnumerationResults.
За замовчуванням Core Data створює SQLite-файл в Library/Application Support, не в Documents. Переносити базу в Documents не рекомендується — вона буде включена в iTunes File Sharing і користувач зможе випадково видалити або змінити її. Виняток — якщо застосунок явно дає користувачеві доступ до даних через Core Data.
UIFileSharingEnabled (Application supports iTunes file sharing) — булевий ключ в Info.plist. При встановленні в YES користувач може копіювати файли з Documents Directory через iTunes та Files. Додай ключ в Info.plist: UIFileSharingEnabled = YES. Включай тільки якщо застосунок дійсно створює користувацькі документи.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також