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 }
// Запазване на кеширан 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-базирано API: то е типобезопасно и се интегрира по-добре с модерни frameworks като 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 MB за изображения и 10 MB за 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 }
// Изброяване и изтриване на стари файлове
// при превишаване на лимита на размера
}
Спазването на тези практики гарантира, че приложението работи правилно при всички действия на системата за изчистване на кеша и потребителят не се сблъсква с неочаквана загуба на данни.
Често задавани въпроси
Не, 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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също