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-based API вместо string-based для лучшей совместимости с современными возможностями iOS.
import Foundation
let fileManager = FileManager.default
guard let documentsURL = fileManager.urls(
for: .documentDirectory,
in: .userDomainMask
).first else { return }
// Create file in 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!
// Exclude file from iCloud backup
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 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также