Ο κατάλογος εγγράφων της εφαρμογής είναι η μόνιμη αποθήκευση αρχείων χρήστη που πρέπει να διατηρούνται μεταξύ συνεδριών και να επαναφέρονται από αντίγραφο ασφαλείας. Σύμφωνα με το Apple File System Programming Guide, 2026, στο iOS ο κατάλογος Documents περιλαμβάνεται αυτόματα στο αντίγραφο ασφαλείας iCloud, σε αντίθεση με την προσωρινή μνήμη και τους προσωρινούς καταλόγους. Η σωστή χρήση του καταλόγου εγγράφων εγγυάται ότι τα αρχεία χρήστη δεν θα χαθούν κατά την ενημέρωση ή επανεγκατάσταση της εφαρμογής.
Κύρια σημεία
context.filesDir με χειροκίνητη διαχείριση αντιγράφων ασφαλείαςΟ κατάλογος εγγράφων — μια εξειδικευμένη αποθήκη μέσα στο sandbox της εφαρμογής, που προορίζεται για τη μόνιμη αποθήκευση αρχείων χρήστη. Σε αντίθεση με την προσωρινή μνήμη, τα αρχεία σε αυτόν τον κατάλογο θεωρούνται σημαντικά για τον χρήστη: δεν διαγράφονται από το σύστημα σε περίπτωση έλλειψης χώρου, διατηρούνται κατά την ενημέρωση της εφαρμογής και δημιουργείται αντίγραφο ασφαλείας κατά τον συγχρονισμό της συσκευής. Στο iOS, ο κατάλογος Documents αποτελεί μέρος του κοντέινερ Sandbox και περιλαμβάνεται αυτόματα στο αντίγραφο ασφαλείας iCloud. Στο Android δεν υπάρχει άμεσο αντίστοιχο — το context.filesDir χρησιμεύει ως αντίστοιχο, που προορίζεται επίσης για μόνιμα αρχεία, αλλά δεν διαθέτει ενσωματωμένο μηχανισμό δημιουργίας αντιγράφων ασφαλείας.
Η διαφορά μεταξύ του καταλόγου εγγράφων και της εσωτερικής αποθήκευσης (Internal Storage) στο Android είναι ελάχιστη: και τα δύο βρίσκονται στο sandbox της εφαρμογής, και τα δύο διαγράφονται κατά την απεγκατάσταση, και τα δύο είναι μη προσβάσιμα σε άλλες εφαρμογές. Η κύρια διαφορά είναι σημασιολογική: το Documents Directory υποθέτει ότι τα αρχεία δημιουργήθηκαν ή εισήχθησαν από τον χρήστη, ενώ το Internal Storage μπορεί να περιέχει εσωτερικά αρχεία εφαρμογής (βάσεις δεδομένων, διαμορφώσεις). Στο iOS η διαφορά είναι πιο σημαντική: το Documents δημιουργεί αυτόματα αντίγραφο ασφαλείας, ενώ το Library/Application Support όχι. Αυτό επηρεάζει τη στρατηγική αποθήκευσης: στο Documents τοποθετείτε μόνο όσα θέλει ο χρήστης να επαναφέρει σε μια νέα συσκευή, και στο Application Support — εσωτερικά δεδομένα που η εφαρμογή μπορεί να αναδημιουργήσει.
Η αρχιτεκτονική του sandbox εγγυάται ότι άλλες εφαρμογές δεν έχουν πρόσβαση στον κατάλογο εγγράφων της εφαρμογής σας. Στο iOS, η πρόσβαση στα Documents άλλων εφαρμογών είναι αδύνατη χωρίς jailbreak. Στο Android, η πρόσβαση root επιτρέπει την ανάγνωση του filesDir οποιασδήποτε εφαρμογής, γι' αυτό τα εμπιστευτικά δεδομένα (κωδικοί, κλειδιά κρυπτογράφησης) πρέπει να προστατεύονται επιπλέον με EncryptedSharedPreferences ή EncryptedFile από τη βιβλιοθήκη AndroidX Security.
Στον κατάλογο εγγράφων πρέπει να τοποθετούνται δεδομένα που έχουν αξία για τον χρήστη και πρέπει να είναι διαθέσιμα μετά την επανεκκίνηση της εφαρμογής ή την επαναφορά της συσκευής. Δεν είναι όλα τα αρχεία κατάλληλα για αποθήκευση σε αυτόν τον κατάλογο — η επιλογή εξαρτάται από τον τύπο δεδομένων και το σενάριο χρήσης.
Τα αρχεία χρήστη — το κύριο περιεχόμενο του καταλόγου εγγράφων. Αυτά μπορεί να είναι έγγραφα κειμένου που δημιουργήθηκαν σε επεξεργαστή, εικόνες που τραβήχτηκαν με την κάμερα της εφαρμογής, εξαγόμενες αναφορές PDF, ηχογραφήσεις, σημειώσεις. Κάθε τέτοιο αρχείο δημιουργήθηκε από τον χρήστη ή κατόπιν αιτήματός του και πρέπει να είναι διαθέσιμο ανά πάσα στιγμή. Στο iOS, τα αρχεία από το Documents εμφανίζονται στην εφαρμογή συστήματος Files, επιτρέποντας στον χρήστη να τα διαχειρίζεται μέσω του τυπικού διαχειριστή αρχείων. Στο Android δεν υπάρχει παρόμοια εμφάνιση — η εφαρμογή πρέπει να παρέχει η ίδια διεπαφή για την προβολή των αποθηκευμένων αρχείων.
Οι βάσεις δεδομένων SQLite και τα αρχεία ρυθμίσεων συνήθως αποθηκεύονται δίπλα στον κατάλογο εγγράφων, αλλά όχι μέσα σε αυτόν. Στο iOS, οι βάσεις δεδομένων τοποθετούνται στο Library/Application Support, καθώς δεν πρέπει να εμφανίζονται στην εφαρμογή Files και να δημιουργούν ξεχωριστό αντίγραφο ασφαλείας. Στο Android, οι βάσεις δεδομένων δημιουργούνται από προεπιλογή στο /data/data/<package>/databases/ μέσω Room ή SQLiteOpenHelper. Εάν η βάση δεδομένων περιέχει περιεχόμενο χρήστη (σημειώσεις, ημερολόγιο, οικονομικές εγγραφές), μπορεί να τοποθετηθεί στο filesDir για να διασφαλιστεί η δημιουργία αντιγράφου ασφαλείας μέσω του συστήματος. Το Room επιτρέπει τον καθορισμό προσαρμοσμένου καταλόγου για την αποθήκευση της βάσης δεδομένων μέσω του callback RoomDatabase.Builder.
val dbFile = File(context.filesDir, "user_database.db")
val db = Room.databaseBuilder<AppDatabase>(
context,
dbFile.absolutePath
).build()
Τα αρχεία που ο χρήστης εισάγει από άλλες εφαρμογές ή εξάγει από την εφαρμογή σας, πρέπει επίσης να αποθηκεύονται στον κατάλογο εγγράφων. Στο iOS, η εισαγωγή μέσω UIDocumentPickerViewController τοποθετεί αυτόματα ένα αντίγραφο του αρχείου στο Documents όταν χρησιμοποιείται η παράμετρος asCopy: true. Στο Android, η εισαγωγή μέσω του διαλόγου SAF δημιουργεί επίσης ένα αντίγραφο του αρχείου στο sandbox της εφαρμογής. Κατά την εξαγωγή δεδομένων (για παράδειγμα, δημιουργία αρχείου CSV με επαφές), αποθηκεύστε πρώτα το αρχείο στο Documents/filesDir και στη συνέχεια προσφέρετε στον χρήστη να το μοιραστεί μέσω του Share Sheet. Αυτό εγγυάται ότι ακόμη κι αν ο χρήστης ξεχάσει να αποθηκεύσει το αρχείο μετά την αποστολή, ένα αντίγραφο παραμένει στην εφαρμογή για μελλοντική χρήση.
Στο Android, τις λειτουργίες του καταλόγου εγγράφων εκτελεί το context.filesDir. Επιπλέον, είναι διαθέσιμος ο κατάλογος context.externalFilesDir στην κάρτα SD, αλλά δεν εγγυάται τη διατήρηση των δεδομένων. Ας εξετάσουμε τις κύριες τεχνικές εργασίας με αυτούς τους καταλόγους.
filesDir — ο κύριος κατάλογος για μόνιμα αρχεία εφαρμογής στο Android. Βρίσκεται στο sandbox της εφαρμογής και διαγράφεται πλήρως κατά την απεγκατάσταση. Για να λάβετε μια παρουσία File, χρησιμοποιήστε το context.filesDir, το οποίο επιστρέφει τη διαδρομή προς τον κατάλογο /data/data/<package>/files/. Για δημιουργία και ανάγνωση αρχείων, χρησιμοποιήστε τυπικές λειτουργίες File σε Java/Kotlin ή μεθόδους Context openFileInput() και openFileOutput(), οι οποίες δέχονται το όνομα αρχείου και επιστρέφουν FileInputStream/FileOutputStream. Η μέθοδος openFileOutput() δημιουργεί αυτόματα το αρχείο στο filesDir εάν δεν υπάρχει ακόμη και επιτρέπει τον καθορισμό της λειτουργίας πρόσβασης: MODE_PRIVATE (μόνο η τρέχουσα εφαρμογή), MODE_APPEND (προσθήκη) ή MODE_WORLD_READABLE (ξεπερασμένο, δεν χρησιμοποιείται από API 24+).
val fileName = "report.pdf"
val content = "PDF content".toByteArray()
context.openFileOutput(fileName, Context.MODE_PRIVATE).use { stream ->
stream.write(content)
}
val bytes = context.openFileInput(fileName).use { stream ->
stream.readBytes()
}
Σε Android 10+, το μοντέλο Scoped Storage δεν επηρεάζει το filesDir — η πρόσβαση στο δικό σας sandbox της εφαρμογής παραμένει πλήρης. Όλες οι λειτουργίες ανάγνωσης και εγγραφής εντός του filesDir δεν απαιτούν πρόσθετες άδειες. Ωστόσο, κατά την προσπάθεια πρόσβασης σε αρχεία άλλης εφαρμογής μέσω filesDir θα λάβετε μια εξαίρεση. Για ανταλλαγή αρχείων, χρησιμοποιήστε το FileProvider, το οποίο δημιουργεί ένα προσωρινό content URI για τη μεταφορά του αρχείου σε άλλη εφαρμογή. Το FileProvider δηλώνεται στο AndroidManifest.xml μέσω της ετικέτας <provider> και διαμορφώνεται στο αρχείο XML διαδρομών. Αυτός είναι ο τυπικός μηχανισμός για μεταφορά αρχείων μεταξύ εφαρμογών, που χρησιμοποιείται για παράδειγμα κατά την αποστολή εικόνας μέσω Intent με ACTION_SEND.
Στο iOS, το Documents Directory αποτελεί μέρος του κοντέινερ Sandbox της εφαρμογής με ειδική κατάσταση. Τα αρχεία από αυτόν τον κατάλογο περιλαμβάνονται αυτόματα στο αντίγραφο ασφαλείας iCloud, εμφανίζονται στην εφαρμογή Files και διατηρούνται κατά την ενημέρωση της εφαρμογής μέσω App Store.
Αυτόματη δημιουργία αντιγράφου ασφαλείας του Documents — το βασικό πλεονέκτημα του iOS. Όταν ο χρήστης συνδέει τη συσκευή στο iTunes ή ενεργοποιεί το iCloud Backup, όλα τα αρχεία από το Documents/ αντιγράφονται στο αντίγραφο ασφαλείας. Κατά την επαναφορά σε μια νέα συσκευή, ο χρήστης λαμβάνει όλα τα αρχεία του χωρίς πρόσθετες ενέργειες. Ωστόσο, αυτό το πλεονέκτημα γίνεται μειονέκτημα εάν η εφαρμογή αποθηκεύει μεγάλους όγκους δεδομένων στο Documents: ο χρόνος δημιουργίας αντιγράφου ασφαλείας αυξάνεται και ο χώρος iCloud μπορεί να εξαντληθεί γρήγορα. Γι' αυτό στο Documents πρέπει να αποθηκεύονται μόνο τα αρχεία που χρειάζονται πραγματικά στον χρήστη κατά την επαναφορά. Τα προσωρινά αρχεία, η προσωρινή μνήμη και τα δεδομένα που μπορούν να αναδημιουργηθούν πρέπει να βρίσκονται στα Caches ή Library/Application Support. Η Apple συνιστά τον αποκλεισμό από το αντίγραφο ασφαλείας αρχείων που μπορούν να ληφθούν ξανά από το διαδίκτυο, μέσω του χαρακτηριστικού isExcludedFromBackup.
let fm = FileManager.default
let docsURL = fm.urls(
for: .documentDirectory,
in: .userDomainMask
).first!
let fileURL = docsURL.appendingPathComponent("notes.txt")
let text = "Περιεχόμενο σημείωσης"
try text.write(to: fileURL, atomically: true, encoding: .utf8)
Το iCloud Drive επιτρέπει τον συγχρονισμό αρχείων από το Documents μεταξύ συσκευών του ίδιου χρήστη. Για την ενεργοποίηση του συγχρονισμού, η εφαρμογή πρέπει να χρησιμοποιεί το API NSDocument ή UIDocument, τα οποία διαχειρίζονται αυτόματα τον έλεγχο εκδόσεων και την επίλυση συγκρούσεων. Εναλλακτική προσέγγιση — χρήση iCloud με CloudKit, το οποίο παρέχει πιο ευέλικτο έλεγχο στον συγχρονισμό, αλλά απαιτεί διαμόρφωση στο CloudKit Dashboard. Κατά τη χρήση του iCloud Drive, βεβαιωθείτε ότι χειρίζεστε σωστά τις συγκρούσεις επεξεργασίας (merge ή last-write-wins) και ενημερώνετε τον χρήστη για την κατάσταση συγχρονισμού μέσω της διεπαφής της εφαρμογής. Το iCloud δεν εγγυάται άμεσο συγχρονισμό — η καθυστέρηση μπορεί να κυμαίνεται από λίγα δευτερόλεπτα έως λίγα λεπτά ανάλογα με το μέγεθος του αρχείου και την ποιότητα της σύνδεσης. Για κρίσιμα σημαντικά δεδομένα, χρησιμοποιήστε συναλλακτική εγγραφή και έλεγχο εκδόσεων, ώστε σε περίπτωση σύγκρουσης να μπορείτε να επαναφέρετε την προηγούμενη έκδοση του αρχείου.
Η σωστή επιλογή μεταξύ Documents Directory και Cache Directory καθορίζει την αξιοπιστία αποθήκευσης των δεδομένων χρήστη. Ένα λάθος στην επιλογή οδηγεί είτε σε απώλεια δεδομένων (εάν σημαντικά αρχεία αποθηκεύονται στην προσωρινή μνήμη) είτε σε υπερχείλιση του αντιγράφου ασφαλείας (εάν προσωρινά αρχεία αποθηκεύονται στο Documents).
| Κριτήριο | Documents Directory | Cache Directory |
|---|---|---|
| Εγγύηση διατήρησης | Υψηλή — δεν διαγράφεται από το σύστημα | Χαμηλή — μπορεί να καθαριστεί |
| Αντίγραφο ασφαλείας (iOS) | Αυτόματα στο iCloud | Δεν δημιουργείται |
| Ορατότητα χρήστη (iOS) | Στην εφαρμογή Files | Κρυφό |
| Καθαρισμός κατά την ενημέρωση | Δεν καθαρίζεται | Μπορεί να καθαριστεί |
| Συνιστώμενο μέγεθος | Οποιοδήποτε, αλλά με έλεγχο μέσω ρυθμίσεων | Έως 100–200 MB |
| Τύπος δεδομένων | Αρχεία χρήστη | Προσωρινά δεδομένα που μπορούν να αναδημιουργηθούν |
Βέλτιστες πρακτικές χρήσης του καταλόγου εγγράφων περιλαμβάνουν αρκετούς βασικούς κανόνες. Πρώτον, ζητάτε πάντα επιβεβαίωση από τον χρήστη πριν από τη διαγραφή αρχείων από αυτόν τον κατάλογο. Σε αντίθεση με την προσωρινή μνήμη, η διαγραφή ενός εγγράφου μπορεί να οδηγήσει σε μη αναστρέψιμη απώλεια περιεχομένου χρήστη. Δεύτερον, εφαρμόστε έλεγχο εκδόσεων αρχείων: κατά την αντικατάσταση ενός υπάρχοντος αρχείου, διατηρήστε την προηγούμενη έκδοση με το επίθημα _backup ή χρησιμοποιήστε μηχανισμούς Snapshot. Τρίτον, παρέχετε στον χρήστη διεπαφή για προβολή, μετονομασία, διαγραφή και εξαγωγή αρχείων από τον κατάλογο εγγράφων. Στο iOS, τα αρχεία από το Documents εμφανίζονται αυτόματα στο Files, στο Android πρέπει να εφαρμόσετε τον δικό σας διαχειριστή αρχείων ή να χρησιμοποιήσετε βιβλιοθήκες τρίτων.
Δώστε ιδιαίτερη προσοχή στη μετεγκατάσταση δεδομένων κατά την ενημέρωση της εφαρμογής. Εάν η νέα έκδοση αλλάζει τη δομή αποθήκευσης αρχείων (για παράδειγμα, μεταφέρει δεδομένα από έναν υποκατάλογο σε άλλον ή αλλάζει τη μορφή αρχείου), εφαρμόστε μια εφάπαξ μετεγκατάσταση κατά την πρώτη εκκίνηση μετά την ενημέρωση. Αποθηκεύστε τον αριθμό έκδοσης του σχήματος δεδομένων στο SharedPreferences και σε περίπτωση αναντιστοιχίας, ξεκινήστε τη μετεγκατάσταση. Μην διαγράφετε παλιά αρχεία μέχρι την ολοκλήρωση της μετεγκατάστασης — σε περίπτωση βλάβης, ο χρήστης δεν πρέπει να χάσει δεδομένα. Εάν η μετεγκατάσταση περιλαμβάνει μετατροπή μορφής (για παράδειγμα, μετάβαση από JSON σε SQLite), διατηρήστε τα αρχικά αρχεία ως αντίγραφο ασφαλείας σε ξεχωριστό κατάλογο με ημερομηνία μετεγκατάστασης. Ο χρήστης πρέπει να έχει τη δυνατότητα να αναστρέψει τις αλλαγές μέσω των ρυθμίσεων της εφαρμογής εντός των πρώτων 30 ημερών μετά την ενημέρωση, όπως συνιστά το Apple Human Interface Guidelines.
Συχνές Ερωτήσεις
Documents εμφανίζεται στην εφαρμογή Files και δημιουργεί αυτόματα αντίγραφο ασφαλείας στο iCloud. Application Support δεν εμφανίζεται στο Files και δεν δημιουργεί αντίγραφο ασφαλείας από προεπιλογή. Επιλέξτε Application Support για εσωτερικά δεδομένα εφαρμογής που δεν χρειάζεται να εμφανίζονται στον χρήστη.
Ναι, κατά τη διαγραφή λογαριασμού προσφέρετε στον χρήστη να καθαρίσει όλα τα τοπικά αρχεία που σχετίζονται με αυτόν τον λογαριασμό. Εμφανίστε ένα παράθυρο διαλόγου με την ερώτηση „Διαγραφή όλων των τοπικών δεδομένων;” και αναφέρετε ποια αρχεία θα επηρεαστούν. Αυτή είναι απαίτηση GDPR και συμμόρφωσης με τις πολιτικές App Store και Google Play.
Σε iOS αρκεί να επαναφέρετε τη συσκευή από αντίγραφο ασφαλείας iCloud ή iTunes — τα αρχεία από το Documents αποκαθίστανται αυτόματα. Σε Android χρησιμοποιήστε το Google Drive Backup API για δημιουργία αντιγράφου ασφαλείας αρχείων από το filesDir ή εφαρμόστε εξαγωγή μέσω υπηρεσίας cloud.
Σε iOS ο χρήστης μπορεί να διαγράψει αρχεία μέσω της εφαρμογής Files. Σε Android η διαγραφή είναι δυνατή μόνο μέσω της διεπαφής της εφαρμογής σας. Συνιστάται η εφαρμογή ενός κάδου ανακύκλωσης για έγγραφα με δυνατότητα επαναφοράς εντός 30 ημερών από τη διαγραφή, για την αποφυγή τυχαίας απώλειας δεδομένων.
Δεν απαιτούνται πρόσθετες ενέργειες — iOS και Android διατηρούν αυτόματα τον κατάλογο εγγράφων κατά την ενημέρωση μέσω App Store ή Google Play. Ωστόσο, σε περίπτωση αλλαγής της δομής αποθήκευσης, εφαρμόστε μετεγκατάσταση δεδομένων κατά την πρώτη εκκίνηση της νέας έκδοσης, ελέγχοντας τον αριθμό έκδοσης σχήματος στις ρυθμίσεις.
Σύνοψη
context.filesDir ως αντίστοιχο — τα αρχεία διατηρούνται κατά την ενημέρωση, αλλά δεν διαθέτουν ενσωματωμένο μηχανισμό δημιουργίας αντιγράφου ασφαλείαςΘα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης