Caches Directory — это директория в песочнице iOS-приложения, предназначенная для хранения временных данных, которые могут быть восстановлены или перезагружены из сети. По данным Apple File System Basics (2024), система может удалять файлы из Caches Directory в любой момент для освобождения места на диске — приложение должно корректно обрабатывать отсутствие этих файлов и при необходимости восстанавливать их. В отличие от Documents Directory, данные из Caches не включаются в резервное копирование iCloud и iTunes, что снижает нагрузку на облачное хранилище пользователя.
Главное
Caches Directory — это директория внутри песочницы iOS-приложения, оптимизированная для хранения данных, которые могут быть восстановлены при необходимости. В отличие от Documents Directory, Caches не предназначена для пользовательских данных — это временное хранилище для ускорения работы приложения.
iOS использует Caches Directory для размещения закэшированных сетевых ответов, предварительно загруженных изображений, сериализованных объектов и данных, которые приложение может восстановить. Разработчик не должен полагаться на долговременное хранение данных в этой директории.
По данным Apple WWDC 2020, около 40% iOS-приложений используют Caches Directory для хранения закэшированных изображений и сетевых данных, при этом 25% разработчиков неправильно размещают в Caches данные, которые должны находиться в Documents или Application Support, из-за непонимания различий между этими директориями.
Критическое свойство Caches: приложение должно корректно обрабатывать ситуацию, когда файл из кэша был удалён системой. Если после удаления кэша функциональность приложения нарушается — значит, данные хранятся в неправильной директории.
В Swift путь к Caches Directory получается стандартным методом FileManager с указанием .cachesDirectory. Это простое действие, которое используется практически в каждом iOS-приложении, работающем с сетевыми данными.
import Foundation
let fileManager = FileManager.default
guard let cachesURL = fileManager.urls(
for: .cachesDirectory,
in: .userDomainMask
).first else { return }
// Save cached JSON
let cacheFile = cachesURL.appendingPathComponent("feed_cache.json")
let jsonData = try JSONSerialization.data(
withJSONObject: response,
options: [.prettyPrinted]
)
try jsonData.write(to: cacheFile)
Objective-C использует NSSearchPathForDirectoriesInDomains с NSCachesDirectory. Несмотря на то, что Apple рекомендует Swift API, Objective-C-код с Caches Directory остаётся рабочим и поддерживается.
@import Foundation;
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSCachesDirectory,
NSUserDomainMask,
YES
);
NSString *cachesPath = paths.firstObject;
NSString *cacheFile = [cachesPath stringByAppendingPathComponent:@"feed_cache.plist"];
Swift-проекты должны предпочитать URL-based API: оно типобезопасно и лучше интегрируется с современными фреймворками, такими как SwiftUI и Combine.
Caches Directory оптимальна для нескольких категорий данных, которые приложение использует для ускорения работы, но не является единственным источником истины. Правильный выбор данных для кэширования напрямую влияет на UX и производительность приложения.
JSON-ответы от API, данные новостных лент, списки объектов — всё, что приложение может повторно загрузить с сервера. Используй URLCache для автоматического кэширования HTTP-ответов либо сохраняй вручную сериализованные объекты.
Изображения, загруженные из сети — самый частый кейс использования Caches Directory. Библиотеки вроде SDWebImage и Kingfisher по умолчанию сохраняют закэшированные изображения именно в Caches.
| Тип данных | Подходит для Caches | Срок хранения |
|---|---|---|
| JSON API-ответы | Да | До очистки системы |
| Изображения из сети | Да | До очистки системы |
| Логи отладки | Условно | Лучше в tmp |
| Сейвы игр | Нет | Только Documents |
| Конфигурации приложения | Нет | Application Support |
Если данные не могут быть восстановлены — им не место в Caches. Это самый простой критерий: представь, что завтра система удалит все файлы из Caches. Если приложение продолжит корректно работать — данные хранятся правильно.
iOS автоматически управляет очисткой Caches Directory, но точные триггеры и алгоритмы не документированы Apple. Известно, что система может удалять файлы из Caches при нехватке места на диске, а также при работе функции Offload Unused Apps.
Процесс очистки — прозрачный для приложения: система удаляет файлы без уведомления. Приложение должно проверять наличие файла перед чтением и создавать его заново при отсутствии. Неполагание на долговременное хранение — ключевое требование при работе с Caches.
По данным статьи Apple "File System Basics" (2024), приложение не должно рассчитывать на то, что файлы в Caches Directory будут доступны между сессиями. Разработчикам рекомендуется реализовать fallback-механизм: при отсутствии кэшированного файла — загрузить данные из сети и сохранить в Caches снова.
Отдельный сценарий — выгрузка приложения (Offload). При активации этой функции iOS удаляет приложение, но сохраняет его Documents Directory. Caches Directory при этом удаляется. Пользователь, восстановивший приложение, не получит кэшированные данные — приложение должно загрузить их заново.
Различие между Caches и Temporary (tmp) директориями часто вызывает путаницу у разработчиков. Обе директории хранят временные данные, но с разными гарантиями времени жизни и назначением.
| Характеристика | Caches Directory | Temporary Directory |
|---|---|---|
| Время жизни | От сессии до сессии (не гарантировано) | Только в рамках сессии |
| Очистка системой | При нехватке места | При завершении сессии или перезагрузке |
| Назначение | Кэш для ускорения работы | Очень временные данные |
| Пример | Закэшированные изображения | Временный файл перед экспортом |
| Бэкап | Нет | Нет |
Выбирай Caches, если данные полезно сохранить между запусками приложения, но их можно восстановить. Используй tmp, если данные нужны только в рамках текущей сессии и не имеют ценности после завершения приложения.
Работа с Caches Directory требует соблюдения нескольких правил, которые помогают избежать потери данных, неожиданного поведения приложения и проблем с производительностью.
FileManager.fileExists(atPath:) должен вызываться перед каждым чтением из Caches. Если файл отсутствует — загрузи данные из первоисточника и сохрани в кэш. Никогда не предполагай, что файл из Caches существует.
Устанавливай максимальный размер Caches Directory в приложении. Например, лимит в 50 МБ для изображений и 10 МБ для JSON-ответов. При превышении лимита удаляй самые старые файлы по дате модификации.
import Foundation
func trimCache(to maxSizeBytes: Int) {
let cachesURL = FileManager.default
.urls(for: .cachesDirectory, in: .userDomainMask)
.first!
guard let enumerator = FileManager.default
.enumerator(
at: cachesURL,
includingPropertiesForKeys: [.fileSizeKey, .contentModificationDateKey]
)
else { return }
// Enumerate and remove old files
// when exceeding size limit
}
Соблюдение этих практик гарантирует, что приложение корректно работает при любых действиях системы по очистке кэша, а пользователь не сталкивается с неожиданной потерей данных.
Часто задаваемые вопросы
Нет, iOS не отправляет уведомлений перед удалением файлов из Caches. Процесс очистки полностью прозрачен для приложения. Единственный способ узнать об удалении — при попытке чтения файла FileManager вернёт nil или выбросит ошибку, и приложение должно обработать эту ситуацию.
Прямого доступа к Caches Directory через Files или iTunes у пользователя нет. Однако пользователь может очистить кэш всех приложений через Настройки > Основные > Хранилище, выбрав конкретное приложение и нажав "Снять загрузку". Также iOS может автоматически очищать кэш при нехватке места.
URLCache — это встроенный механизм кэширования HTTP-запросов от Foundation. Он автоматически сохраняет и загружает кэшированные ответы, используя Caches Directory под капотом. Ручное сохранение даёт больше контроля: можно выбирать формат, шифровать данные и управлять временем жизни каждого файла индивидуально.
При обновлении приложения через App Store Caches Directory сохраняется. Однако содержимое может быть удалено системой, если новое обновление требует больше места для установки. Разработчику не следует полагаться на сохранность Caches после обновления — это дополнительная причина для реализации fallback-механизма.
Установи URLCache в nil для конкретной сессии NSURLSession или используй политику кэширования .reloadIgnoringLocalCacheData. Также можно создать конфигурацию URLSessionConfiguration с пустым кэшем: sessionConfiguration.urlCache = nil. Это полезно для данных, которые всегда должны быть актуальными.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также