Documents Directory — είναι ένας κατάλογος στο sandbox της εφαρμογής iOS, προορισμένος για την αποθήκευση δεδομένων χρήστη που πρέπει να διατηρούνται μεταξύ των συνεδριών της εφαρμογής και να είναι προσβάσιμα στον χρήστη μέσω iTunes File Sharing και iCloud. Σύμφωνα με το Apple File System Programming Guide (2024), το περιεχόμενο αυτού του καταλόγου συμπεριλαμβάνεται αυτόματα στο αντίγραφο ασφαλείας iCloud και iTunes, επομένως ο προγραμματιστής πρέπει να επιλέγει συνειδητά ποια δεδομένα θα τοποθετεί στο Documents. Σε αντίθεση με το Caches Directory, τα αρχεία στο Documents δεν διαγράφονται από το σύστημα όταν υπάρχει έλλειψη χώρου — η ευθύνη για τη διαχείριση του μεγέθους βαρύνει στην εφαρμογή.
Βασικά σημεία
Documents Directory — είναι ένας κατάλογος μέσα στο sandbox της εφαρμογής iOS, προορισμένος για την αποθήκευση δεδομένων χρήστη που πρέπει να διατηρούνται μεταξύ εκκινήσεων και να είναι προσβάσιμα στον χρήστη. Κάθε εφαρμογή λαμβάνει το δικό της απομονωμένο sandbox, και το Documents είναι ένας από τους βασικούς καταλόγους μαζί με τα Caches, tmp και Library.
Το iOS χρησιμοποιεί αυστηρό sandbox: η εφαρμογή δεν έχει πρόσβαση στο σύστημα αρχείων άλλων εφαρμογών και σε καταλόγους συστήματος χωρίς ειδικές άδειες. Documents Directory — ο μοναδικός κατάλογος του οποίου το περιεχόμενο μπορεί να δεί ο χρήστης μέσω iTunes File Sharing (όταν ενεργοποιηθεί το αντίστοιχο κλειδί UIFileSharingEnabled στο Info.plist).
Σύμφωνα με τα δεδομένα της Apple WWDC 2023, πάνω από 85% των εφαρμογών στο App Store χρησιμοποιούν το Documents Directory για την αποθήκευση τουλάχιστον ενός τύπου δεδομένων χρήστη — από εξηγμένα PDF έως αποθηκευμένα αρχεία παιχνιδιών και εξηγμένες εικόνες.
Ο προγραμματιστής πρέπει να καταλάβει: τα αρχεία στο Documents συμπεριλαμβάνονται αυτόματα στο αντίγραφο ασφαλείας iCloud και iTunes. Εάν η εφαρμογή αποθηκεύει στο Documents μεγάλες ποσότητες δεδομένων που μπορούν να αποκατασταθούν (για παράδειγμα, κρύπτη μνήμη εικόνων ή προσωρινά αρχεία), αυτό θα οδηγήσει σε αδικαιολόγητη κατανάλωση χώρου στον αποθηκευτή iCloud του χρήστη.
Στο Swift, η διαδρομή προς το Documents Directory λαμβάνεται μέσω FileManager. Η Apple συνιστά τη χρήση API βασισμένου σε URL αντί για καλύτερη συμβατότητα με τις σύγχρονες δυνατότητες του iOS.
import Foundation
let fileManager = FileManager.default
guard let documentsURL = fileManager.urls(
for: .documentDirectory,
in: .userDomainMask
).first else { return }
// Δημιουργία αρχείου στο Documents
let fileURL = documentsURL.appendingPathComponent("report.pdf")
let data = Data("Hello, world!".utf8)
try data.write(to: fileURL)
Το Objective-C χρησιμοποιεί το NSSearchPathForDirectoriesInDomains — μια παλαιότερη αλλά ακόμα υποστηριζόμενη προσέγγιση που επιστρέφει διαδρομή ως συμβολοσειρά αντί για URL.
@import Foundation;
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory,
NSUserDomainMask,
YES
);
NSString *documentsPath = paths.firstObject;
NSString *filePath = [documentsPath stringByAppendingPathComponent:@"report.pdf"];
Τα σύγχρονα έργα σε Swift πρέπει να χρησιμοποιούν FileManager.urls, επειδή αυτή η μέθοδος επιστρέφει URL, όχι συμβολοσειρά, πράγμα που μειώνει τον κίνδυνο σφαλμάτων κωδικοποίησης διαδρομών και κάνει τον κώδικα πιο ασφαλή ως προς τυπους.
Documents Directory προορίζεται για δεδομένα που δημιουργούνται από τον χρήστη ή είναι απαραίτητα στον χρήστη σε ρητή μορφή. Η Apple επισημαίνει αρκετές κατηγορίες που είναι κατάλληλες για αυτόν τον κατάλογο.
Αρχεία που ο χρήστης δημιουργεί ή εισάγει — έγγραφα κειμένου, PDF, εικόνες, εξηγμένες αναφορές, αρχεία αντιγράφων ασφαλείας. Αυτά τα δεδομένα έχουν άμεση αξία για τον χρήστη, και η απώλειά τους θα ήταν κριτική.
Αποθηκευμένα παιχνιδιών, αρχεία κατάστασης εφαρμογής, εξηγμένα έργα — όλα όσα ο χρήστης περιμένει να αποκαταστήσει μετά την επανεγκατάσταση της εφαρμογής. Ωστόσο, για κρίσιμα δεδομένα συνιστάται επίσης η χρήση iCloud Key-Value Storage ή Core Data με συγχρονισμό iCloud.
| Τύπος δεδομένων | Κατάλληλο για Documents | Εναλλακτική |
|---|---|---|
| PDF και έγγραφα κειμένου | Ναι | — |
| Κρύπτη μνήμη εικόνων | Όχι | Caches Directory |
| Αποθηκευμένα παιχνιδιών | Ναι | iCloud KVS |
| Αρχεία καταγραφής και δεδομένα εντοπισμού σφαλμάτων | Όχι | Caches ή tmp |
| Εξηγμένες αναφορές | Ναι | — |
Το βασικό κριτήριο: εάν τα δεδομένα μπορούν να αποκατασταθούν από το δίκτυο ή να δημιουργηθούν ξανά — η θέση τους είναι στο Caches, όχι στο Documents. Κάθε gigabyte στο Documents είναι ένα gigabyte στο αντίγραφο ασφαλείας iCloud του χρήστη.
iOS συμπεριλαμβάνει αυτόματα το περιεχόμενο του Documents Directory στο αντίγραφο ασφαλείας κατά τη σύνδεση της συσκευής στο iTunes ή κατά τον συγχρονισμό με iCloud. Αυτή η συμπεριφορά δεν μπορεί να απενεργοποιηθεί σε επίπεδο καταλόγου — μόνο αρχείο προς αρχείο μέσω του χαρακτηριστικού NSURLIsExcludedFromBackupKey.
Από το iOS 5.0, η Apple άρχισε να απορρίπτει εφαρμογές που αποθηκεύουν μεγάλες ποσότητες αποκαταστάσιμων δεδομένων στο Documents. Σύσταση Apple: τα αρχεία που μπορούν να ληφθούν ξανά πρέπει να αποθηκεύονται στο Caches Directory με σημαία εξαίρεσης από το αντίγραφο ασφαλείας.
import Foundation
let documentsURL = FileManager.default
.urls(for: .documentDirectory, in: .userDomainMask)
.first!
// Εξαίρεση αρχείου από το αντίγραφο iCloud
var resourceValues = URLResourceValues()
resourceValues.isExcludedFromBackup = true
var fileURL = documentsURL.appendingPathComponent("cached_data.json")
try fileURL.setResourceValues(resourceValues)
Ο συγχρονισμός iCloud λειτουργεί μέσω NSUbiquitousContainer εάν η εφαρμογή χρησιμοποιεί iCloud Documents. Σε αυτή την περίπτωση, τα αρχεία από το Documents Directory συγχρονίζονται αυτόματα μεταξύ των συσκευών του χρήστη. Για εφαρμογές χωρίς iCloud, ο συγχρονισμός περιορίζεται στο αντίγραφο ασφαλείας.
Η διαφορά μεταξύ Documents και Caches — μια από τις πιο συχνές παρανοήσεις μεταξύ αρχαρίων προγραμματιστών iOS. Η βασική διαφορά: το σύστημα μπορεί ανά πάσα στιγμή να διαγράψει αρχεία από τα Caches για να ελευθερώσει χώρο, αλλά ποτέ δεν αγγίζει τα Documents χωρίς τη γνώση του χρήστη.
| Χαρακτηριστικό | Documents Directory | Caches Directory |
|---|---|---|
| Αντίγραφο iCloud | Ναι (προκαθορισμένα) | Όχι |
| Διαγραφή από σύστημα | Ποτέ | Σε έλλειψη χώρου |
| iTunes File Sharing | Ναι (όταν ενεργοποιηθεί η σημαία) | Όχι |
| Σκοπός | Δεδομένα χρήστη | Κρυπτή μνήμη, προσωρινά δεδομένα |
| Αποκατάσταση δεδομένων | Απαιτείται αποκατάσταση | Μπορεί να ληφθεί ξανά από το δίκτυο |
Σύμφωνα με την Apple Developer Documentation (2024), η εσφαλμένη χρήση του Documents Directory — μία από τις συχνές αιτίες απόρριψης εφαρμογών κατά την αξιολόγηση: εάν η εφαρμογή αποθηκεύει περισσότερα από λίγα megabyte αποκαταστάσιμων δεδομένων στο Documents, η Apple συνιστά τη μεταφορά τους στα Caches ή την εφαρμογή NSURLIsExcludedFromBackupKey.
Πρακτικός κανόνας: εάν ο χρήστης θα λυπηθεί από την απώλεια του αρχείου — αποθήκευσε στο Documents. Εάν το αρχείο μπορεί να ληφθεί ξανά ή να δημιουργηθεί — αποθήκευσε στο Caches.
Οι έμπειροι προγραμματιστές iOS έχουν αναπτύξει αρκετούς κανόνες που βοηθούν να αποφυγούν προβλήματα με το Documents Directory σε όλα τα στάδια του κύκλου ζωής της εφαρμογής — από την ανάπτυξη έως τη δημοσίευση στο App Store.
Ελέγχε τακτικά το μέγεθος του Documents Directory μέσω FileManager.enumerator(at:includingPropertiesForKeys:). Εάν το μέγεθος υπερβαίνει τα 100 MB για δεδομένα που δεν είναι δεδομένα χρήστη — αυτός είναι λόγος για επαναξέταση της αρχιτεκτονικής αποθήκευσης.
Για όλα τα αρχεία που μπορούν να ληφθούν ξανά από το δίκτυο, ορίσε isExcludedFromBackup = true. Αυτό μειώνει το φορτίο στον αποθηκευτή iCloud του χρήστη και μειώνει τον κίνδυνο απόρριψης της εφαρμογής από το App Review.
Κατά την αλλαγή μορφής δεδομένων στο Documents, πρόβλεψε μετανάστευση: μην διαγράφεις παλιά αρχεία μέχρι να βεβαιωθείς ότι τα νέα έχουν δημιουργηθεί σωστά. Χρησιμοποίησε υποκαταλόγους ειδικούς για την έκδοση.
import Foundation
let documentsURL = FileManager.default
.urls(for: .documentDirectory, in: .userDomainMask)
.first!
let versionDir = documentsURL.appendingPathComponent("v2")
try FileManager.default.createDirectory(
at: versionDir,
withIntermediateDirectories: true
)
Η τήρηση αυτών των πρακτικών μειώνει τον κίνδυνο απώλειας δεδομένων χρήστη, μειώνει το μέγεθος του αντιγράφου ασφαλείας iCloud και διευκολύνει τη διεργασία αξιολόγησης στο App Store.
Συχνές Ερωτήσεις
Ναι, μέσω της εφαρμογής Files — η ενσωματωμένη εφαρμογή iOS από την έκδοση 11. Όταν ενεργοποιηθεί το κλειδί UIFileSharingEnabled στο Info.plist, το περιεχόμενο του Documents Directory εμφανίζεται στην εφαρμογή Files στην ενότητα «Στο iPhone μου». Ο χρήστης μπορεί να βλέπει, να αντιγράφει και να διαγράφει αρχεία.
Ολόκληρο το sandbox της εφαρμογής, συμπεριλαμβανομένου του Documents Directory, Caches, tmp και Library, διαγράφεται πλήρως από τη συσκευή. Τα αντίγραφα ασφαλείας στο iCloud παραμένουν μέχρι την αποκατάσταση ή την μανυαλική διαγραφή. Κατά την επανεγκατάσταση, η εφαρμογή ξεκινά με καθαρό sandbox.
Χρησιμοποίησε το FileManager.enumerator για να διασχίσεις όλα τα αρχεία στον κατάλογο και να συμψήσεις τα μεγέθη τους. Για κάθε αρχείο, λήψε το χαρακτηριστικό .fileSize μέσω resourceValues(forKeys:). Εναλλακτικά, χρησιμοποίησε το URLResourceKey.fileSizeKey και το .directoryEnumerationResults.
Από προκαθορισμό, το Core Data δημιουργεί το αρχείο SQLite στο Library/Application Support, όχι στο Documents. Η μεταφορά της βάσης στο Documents δεν συνιστάται — θα συμπεριληφθεί στο iTunes File Sharing και ο χρήστης μπορεί να τη διαγράψει ή να την τροποποιήσει κατά λάθος. Εξαίρεση: εάν η εφαρμογή παρέχει ρητά πρόσβαση στον χρήστη μέσω Core Data.
UIFileSharingEnabled (Application supports iTunes file sharing) — ένα ακεραίο κλειδί στο Info.plist. Όταν οριστεί σε YES, ο χρήστης μπορεί να αντιγράψει αρχεία από το Documents Directory μέσω iTunes και Files. Πρόσθεσε το κλειδί στο Info.plist: UIFileSharingEnabled = YES. Ενεργοποίησε μόνο εάν η εφαρμογή πραγματικά δημιουργεί έγγραφα χρήστη.
Περίληψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης