Caches Directory — to katalog w piaskownicy aplikacji iOS, przeznaczony do przechowywania tymczasowych danych, które można przywrócić lub ponownie pobrać z sieci. Według Apple File System Basics (2024), system może w każdej chwili usuwać pliki z Caches Directory, aby zwolnić miejsce na dysku — aplikacja musi poprawnie obsługiwać brak tych plików i w razie potrzeby przywracać je. W przeciwieństwie do Documents Directory, dane z Caches nie są uwzględniane w kopii zapasowej iCloud i iTunes, co zmniejsza obciążenie magazynu w chmurze użytkownika.
Najważniejsze
Caches Directory — to katalog wewnątrz piaskownicy aplikacji iOS, zoptymalizowany pod kątem przechowywania danych, które można w razie potrzeby przywrócić. W przeciwieństwie do Documents Directory, Caches nie jest przeznaczony dla danych użytkownika — to tymczasowe przechowywanie w celu przyspieszenia działania aplikacji.
iOS używa Caches Directory do umieszczania zbuforowanych odpowiedzi sieciowych, wstępnie załadowanych obrazów, serializowanych obiektów i danych, które aplikacja może przywrócić. Deweloper nie powinien polegać na długoterminowym przechowywaniu danych w tym katalogu.
Według danych Apple WWDC 2020, około 40% aplikacji iOS używa Caches Directory do przechowywania buforowanych obrazów i danych sieciowych, przy czym 25% deweloperów nieprawidłowo umieszcza w Caches dane, które powinny znajdować się w Documents lub Application Support, z powodu niezrozumienia różnic między tymi katalogami.
Krytyczna właściwość Caches: aplikacja musi poprawnie obsługiwać sytuację, gdy plik z pamięci podręcznej został usunięty przez system. Jeśli po usunięciu pamięci podręcznej funkcjonalność aplikacji jest zaburzona — oznacza to, że dane są przechowywane w niewłaściwym katalogu.
W Swift ścieżka do Caches Directory jest uzyskiwana standardową metodą FileManager z wskazaniem .cachesDirectory. To prosta czynność, używana praktycznie w każdej aplikacji iOS pracującej z danymi sieciowymi.
import Foundation
let fileManager = FileManager.default
guard let cachesURL = fileManager.urls(
for: .cachesDirectory,
in: .userDomainMask
).first else { return }
// Zapisz buforowany JSON
let cacheFile = cachesURL.appendingPathComponent("feed_cache.json")
let jsonData = try JSONSerialization.data(
withJSONObject: response,
options: [.prettyPrinted]
)
try jsonData.write(to: cacheFile)
Objective-C używa NSSearchPathForDirectoriesInDomains z NSCachesDirectory. Pomimo że Apple zaleca Swift API, kod Objective-C z Caches Directory pozostaje działający i wspierany.
@import Foundation;
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSCachesDirectory,
NSUserDomainMask,
YES
);
NSString *cachesPath = paths.firstObject;
NSString *cacheFile = [cachesPath stringByAppendingPathComponent:@"feed_cache.plist"];
Projekty Swift powinny preferować URL-based API: jest bezpieczne typowo i lepiej integruje się z nowoczesnymi frameworkami takimi jak SwiftUI i Combine.
Caches Directory jest optymalny dla kilku kategorii danych, które aplikacja wykorzystuje do przyspieszenia działania, ale nie jest jedynym źródłem prawdy. Prawidłowy wybór danych do buforowania bezpośrednio wpływa na UX i wydajność aplikacji.
Odpowiedzi JSON z API, dane kanałów informacyjnych, listy obiektów — wszystko, co aplikacja może ponownie pobrać z serwera. Użyj URLCache do automatycznego buforowania odpowiedzi HTTP lub zapisuj ręcznie serializowane obiekty.
Obrazy pobrane z sieci — najczęstszy przypadek użycia Caches Directory. Biblioteki takie jak SDWebImage i Kingfisher domyślnie zapisują buforowane obrazy właśnie w Caches.
| Typ danych | Odpowiedni dla Caches | Czas przechowywania |
|---|---|---|
| JSON odpowiedzi API | Tak | Do czyszczenia systemu |
| Obrazy z sieci | Tak | Do czyszczenia systemu |
| Logi debugowania | Warunkowo | Lepiej w tmp |
| Zapisy gier | Nie | Tylko Documents |
| Konfiguracje aplikacji | Nie | Application Support |
Jeśli dane nie mogą być przywrócone — ich miejsce nie jest w Caches. To najprostsze kryterium: wyobraź sobie, że jutro system usunie wszystkie pliki z Caches. Jeśli aplikacja będzie nadal działać poprawnie — dane są przechowywane prawidłowo.
iOS automatycznie zarządza czyszczeniem Caches Directory, ale dokładne wyzwalacze i algorytmy nie są udokumentowane przez Apple. Wiadomo, że system może usuwać pliki z Caches przy braku miejsca na dysku, a także podczas działania funkcji Offload Unused Apps.
Proces czyszczenia jest przezroczysty dla aplikacji: system usuwa pliki bez powiadomienia. Aplikacja musi sprawdzać obecność pliku przed odczytem i tworzyć go ponownie w przypadku braku. Niejednokrotne poleganie na długoterminowym przechowywaniu to kluczowy wymóg podczas pracy z Caches.
Według artykułu Apple "File System Basics" (2024), aplikacja nie powinna liczyć na to, że pliki w Caches Directory będą dostępne między sesjami. Deweloperom zaleca się zaimplementowanie mechanizmu fallback: w przypadku braku buforowanego pliku — pobierz dane z sieci i zapisz w Caches ponownie.
Osobny scenariusz — wyładowanie aplikacji (Offload). Przy aktywacji tej funkcji iOS usuwa aplikację, ale zachowuje jej Documents Directory. Caches Directory przy tym jest usuwany. Użytkownik, który przywrócił aplikację, nie otrzyma buforowanych danych — aplikacja musi je pobrać ponownie.
Różnica między Caches a Temporary (tmp) często powoduje zamieszanie wśród deweloperów. Oba katalogi przechowują tymczasowe dane, ale z różnymi gwarancjami czasu życia i przeznaczeniem.
| Cecha | Caches Directory | Temporary Directory |
|---|---|---|
| Czas życia | Od sesji do sesji (nie gwarantowany) | Tylko w ramach sesji |
| Czyszczenie przez system | Przy braku miejsca | Po zakończeniu sesji lub ponownym uruchomieniu |
| Przeznaczenie | Pamięć podręczna dla przyspieszenia | Bardzo tymczasowe dane |
| Przykład | Buforowane obrazy | Tymczasowy plik przed eksportem |
| Kopia zapasowa | Nie | Nie |
Wybierz Caches, jeśli dane są przydatne do zachowania między uruchomieniami aplikacji, ale można je przywrócić. Użyj tmp, jeśli dane są potrzebne tylko w bieżącej sesji i nie mają wartości po zakończeniu aplikacji.
Praca z Caches Directory wymaga przestrzegania kilku zasad, które pomagają uniknąć utraty danych, nieoczekiwanego zachowania aplikacji i problemów z wydajnością.
FileManager.fileExists(atPath:) powinien być wywoływany przed każdym odczytem z Caches. Jeśli plik nie istnieje — pobierz dane z oryginalnego źródła i zapisz w pamięci podręcznej. Nigdy nie zakładaj, że plik z Caches istnieje.
Ustaw maksymalny rozmiar Caches Directory w aplikacji. Na przykład limit 50 MB dla obrazów i 10 MB dla odpowiedzi JSON. Po przekroczeniu limitu usuwaj najstarsze pliki według daty modyfikacji.
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 }
// Wylicz i usuń stare pliki
// po przekroczeniu limitu rozmiaru
}
Przestrzeganie tych praktyk gwarantuje, że aplikacja działa poprawnie przy wszystkich działaniach systemu związanych z czyszczeniem pamięci podręcznej, a użytkownik nie spotyka się z nieoczekiwaną utratą danych.
Często zadawane pytania
Nie, iOS nie wysyła powiadomień przed usunięciem plików z Caches. Proces czyszczenia jest całkowicie przezroczysty dla aplikacji. Jedynym sposobem, aby dowiedzieć się o usunięciu, jest próba odczytu pliku — FileManager zwróci nil lub zgłosi błąd, a aplikacja musi obsłużyć tę sytuację.
Bezpośredniego dostępu do Caches Directory przez Files lub iTunes użytkownik nie ma. Jednak użytkownik może wyczyścić pamięć podręczną wszystkich aplikacji przez Ustawienia > Ogólne > Pamięć, wybierając konkretną aplikację i naciskając "Wyładuj aplikację". iOS może również automatycznie czyścić pamięć podręczną przy braku miejsca.
URLCache — to wbudowany mechanizm buforowania żądań HTTP z Foundation. Automatycznie zapisuje i ładuje buforowane odpowiedzi, używając Caches Directory pod spodem. Ręczne zapisywanie daje więcej kontroli: można wybrać format, szyfrować dane i zarządzać czasem życia każdego pliku indywidualnie.
Podczas aktualizacji aplikacji przez App Store Caches Directory jest zachowywany. Jednak zawartość może zostać usunięta przez system, jeśli nowa aktualizacja wymaga więcej miejsca do instalacji. Deweloper nie powinien polegać na zachowaniu Caches po aktualizacji — to dodatkowy powód do wdrożenia mechanizmu fallback.
Ustaw URLCache na nil dla konkretnej sesji NSURLSession lub użyj polityki buforowania .reloadIgnoringLocalCacheData. Można również utworzyć konfigurację URLSessionConfiguration z pustą pamięcią podręczną: sessionConfiguration.urlCache = nil. Jest to przydatne dla danych, które zawsze muszą być aktualne.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również