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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також