Caches Directory — είναι ένας κατάλογος στο sandbox της εφαρμογής iOS, που προορίζεται για την αποθήκευση προσωρινών δεδομένων τα οποία μπορούν να ανακτηθούν ή να επαναφορτωθούν από το δίκτυο. Σύμφωνα με το Apple File System Basics (2024), το σύστημα μπορεί ανά πάσα στιγμή να διαγράψει αρχεία από το Caches Directory για να ελευθερώσει χώρο στο δίσκο — η εφαρμογή πρέπει να χειρίζεται σωστά την απουσία αυτών των αρχείων και να τα επαναφέρει όταν χρειάζεται. Σε αντίθεση με το Documents Directory, τα δεδομένα από το Caches δεν συμπεριλαμβάνονται στα αντίγραφα ασφαλείας iCloud και iTunes, μειώνοντας το φορτίο στο cloud storage του χρήστη.
Κύρια σημεία
Caches Directory — είναι ένας κατάλογος μέσα στο sandbox της εφαρμογής iOS, βελτιστοποιημένος για αποθήκευση δεδομένων που μπορούν να ανακτηθούν όταν χρειαστεί. Σε αντίθεση με το Documents Directory, το Caches δεν προορίζεται για δεδομένα χρήστη — είναι προσωρινή αποθήκευση για την επιτάχυνση της λειτουργίας της εφαρμογής.
Το iOS χρησιμοποιεί το Caches Directory για την τοποθέτηση αποθηκευμένων σε cache απαντήσεων δικτύου, προφορτωμένων εικόνων, σειριοποιημένων αντικειμένων και δεδομένων που η εφαρμογή μπορεί να ανακτήσει. Ο προγραμματιστής δεν πρέπει να βασίζεται στη μακροπρόθεσμη αποθήκευση δεδομένων σε αυτόν τον κατάλογο.
Σύμφωνα με δεδομένα του Apple WWDC 2020, περίπου το 40% των εφαρμογών iOS χρησιμοποιούν το Caches Directory για αποθήκευση εικόνων cache και δεδομένων δικτύου, ενώ το 25% των προγραμματιστών τοποθετούν εσφαλμένα στο Caches δεδομένα που θα έπρεπε να βρίσκονται στο Documents ή στο Application Support, λόγω μη κατανόησης των διαφορών μεταξύ αυτών των καταλόγων.
Κρίσιμη ιδιότητα του Caches: η εφαρμογή πρέπει να χειρίζεται σωστά την κατάσταση όταν ένα αρχείο cache έχει διαγραφεί από το σύστημα. Αν μετά τη διαγραφή της cache η λειτουργικότητα της εφαρμογής διαταράσσεται — σημαίνει ότι τα δεδομένα αποθηκεύονται σε λάθος κατάλογο.
Στη Swift, η διαδρομή στο Caches Directory λαμβάνεται με την τυπική μέθοδο FileManager με τον προσδιορισμό .cachesDirectory. Είναι μια απλή λειτουργία που χρησιμοποιείται σχεδόν σε κάθε εφαρμογή iOS που εργάζεται με δεδομένα δικτύου.
import Foundation
let fileManager = FileManager.default
guard let cachesURL = fileManager.urls(
for: .cachesDirectory,
in: .userDomainMask
).first else { return }
// Αποθήκευση cache 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: είναι ασφαλές ως προς τους τύπους και ενσωματώνεται καλύτερα με σύγχρονα frameworks όπως το SwiftUI και το Combine.
Caches Directory είναι βέλτιστο για διάφορες κατηγορίες δεδομένων που η εφαρμογή χρησιμοποιεί για να επιταχύνει τη λειτουργία της, αλλά δεν είναι η μοναδική πηγή αλήθειας. Η σωστή επιλογή δεδομένων για caching επηρεάζει άμεσα την εμπειρία χρήστη και την απόδοση της εφαρμογής.
Απαντήσεις JSON από API, δεδομένα ειδήσεων, λίστες αντικειμένων — ό,τι μπορεί η εφαρμογή να επαναφορτώσει από τον διακομιστή. Χρησιμοποιήστε το URLCache για αυτόματο caching των HTTP απαντήσεων ή αποθηκεύστε χειροκίνητα σειριοποιημένα αντικείμενα.
Εικόνες που έχουν ληφθεί από το δίκτυο — η πιο συνηθισμένη περίπτωση χρήσης του Caches Directory. Βιβλιοθήκες όπως το SDWebImage και το Kingfisher αποθηκεύουν από προεπιλογή τις εικόνες cache ακριβώς στο 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: όταν το αρχείο cache λείπει — φορτώστε τα δεδομένα από το δίκτυο και αποθηκεύστε τα ξανά στο Caches.
Ξεχωριστό σενάριο — η εκφόρτωση της εφαρμογής (Offload). Κατά την ενεργοποίηση αυτής της λειτουργίας, το iOS διαγράφει την εφαρμογή αλλά διατηρεί το Documents Directory. Το Caches Directory διαγράφεται σε αυτή τη διαδικασία. Ο χρήστης που επανέφερε την εφαρμογή δεν θα λάβει τα δεδομένα cache — η εφαρμογή πρέπει να τα φορτώσει ξανά.
Η διαφορά μεταξύ Caches και Temporary (tmp) συχνά προκαλεί σύγχυση στους προγραμματιστές. Και οι δύο κατάλογοι αποθηκεύουν προσωρινά δεδομένα, αλλά με διαφορετικές εγγυήσεις διάρκειας ζωής και σκοπό.
| Χαρακτηριστικό | Caches Directory | Temporary Directory |
|---|---|---|
| Διάρκεια ζωής | Από συνεδρία σε συνεδρία (δεν είναι εγγυημένη) | Μόνο εντός της συνεδρίας |
| Εκκαθάριση από σύστημα | Όταν δεν υπάρχει αρκετός χώρος | Στο τέλος συνεδρίας ή επανεκκίνηση |
| Σκοπός | Cache για επιτάχυνση | Πολύ προσωρινά δεδομένα |
| Παράδειγμα | Εικόνες cache | Προσωρινό αρχείο πριν από εξαγωγή |
| Αντίγραφο ασφαλείας | Όχι | Όχι |
Επιλέξτε Caches αν τα δεδομένα είναι χρήσιμο να διατηρηθούν μεταξύ εκκινήσεων της εφαρμογής, αλλά μπορούν να ανακτηθούν. Χρησιμοποιήστε tmp αν τα δεδομένα χρειάζονται μόνο στην τρέχουσα συνεδρία και δεν έχουν αξία μετά τον τερματισμό της εφαρμογής.
Η εργασία με το Caches Directory απαιτεί τήρηση αρκετών κανόνων που βοηθούν στην αποφυγή απώλειας δεδομένων, απροσδόκητης συμπεριφοράς της εφαρμογής και προβλημάτων απόδοσης.
Το FileManager.fileExists(atPath:) πρέπει να καλείται πριν από κάθε ανάγνωση από το Caches. Αν το αρχείο λείπει — φορτώστε τα δεδομένα από την αρχική πηγή και αποθηκεύστε τα στην cache. Ποτέ μην υποθέτετε ότι το αρχείο από το 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 }
// Απαρίθμηση και διαγραφή παλιών αρχείων
// όταν υπερβαίνει το όριο μεγέθους
}
Η τήρηση αυτών των πρακτικών εγγυάται ότι η εφαρμογή λειτουργεί σωστά σε όλες τις ενέργειες εκκαθάρισης cache από το σύστημα, και ο χρήστης δεν αντιμετωπίζει απροσδόκητη απώλεια δεδομένων.
Συχνές Ερωτήσεις
Όχι, το iOS δεν στέλνει ειδοποιήσεις πριν από τη διαγραφή αρχείων από το Caches. Η διαδικασία εκκαθάρισης είναι εντελώς διαφανής για την εφαρμογή. Ο μόνος τρόπος να μάθετε για τη διαγραφή — κατά την προσπάθεια ανάγνωσης του αρχείου, το FileManager επιστρέφει nil ή ρίχνει σφάλμα, και η εφαρμογή πρέπει να χειριστεί αυτήν την κατάσταση.
Άμεση πρόσβαση στο Caches Directory μέσω Files ή iTunes ο χρήστης δεν έχει. Ωστόσο, ο χρήστης μπορεί να εκκαθαρίσει την cache όλων των εφαρμογών μέσω Ρυθμίσεις > Γενικά > Αποθηκευτικός χώρος, επιλέγοντας μια συγκεκριμένη εφαρμογή και πατώντας "Εκφόρτωση εφαρμογής". Το iOS μπορεί επίσης να εκκαθαρίζει αυτόματα την cache όταν δεν υπάρχει αρκετός χώρος.
Το URLCache — είναι ένας ενσωματωμένος μηχανισμός caching HTTP αιτημάτων από το Foundation. Αποθηκεύει και φορτώνει αυτόματα τις απαντήσεις cache, χρησιμοποιώντας το Caches Directory στο παρασκήνιο. Η χειροκίνητη αποθήκευση παρέχει περισσότερο έλεγχο: μπορείτε να επιλέξετε μορφή, να κρυπτογραφήσετε δεδομένα και να διαχειριστείτε τη διάρκεια ζωής κάθε αρχείου ξεχωριστά.
Κατά την ενημέρωση της εφαρμογής μέσω του App Store, το Caches Directory διατηρείται. Ωστόσο, το περιεχόμενο μπορεί να διαγραφεί από το σύστημα αν η νέα ενημέρωση απαιτεί περισσότερο χώρο για εγκατάσταση. Ο προγραμματιστής δεν πρέπει να βασίζεται στη διατήρηση του Caches μετά από ενημέρωση — αυτός είναι ένας επιπλέον λόγος για την εφαρμογή μηχανισμού fallback.
Ορίστε το URLCache σε nil για μια συγκεκριμένη συνεδρία NSURLSession ή χρησιμοποιήστε την πολιτική caching .reloadIgnoringLocalCacheData. Μπορείτε επίσης να δημιουργήσετε μια διαμόρφωση URLSessionConfiguration με κενή cache: sessionConfiguration.urlCache = nil. Αυτό είναι χρήσιμο για δεδομένα που πρέπει να είναι πάντα ενημερωμένα.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης