UIDocumentPickerViewController — είναι ένας ελεγκτής συστήματος iOS για την επιλογή εγγράφων από το σύστημα αρχείων, το iCloud Drive και τρίτες υπηρεσίες cloud. Ο ελεγκτής παρέχει μια ενοποιημένη διεπαφή για το άνοιγμα και την εισαγωγή αρχείων οποιουδήποτε τύπου: εικόνες, PDF, κείμενα και ήχο. Σύμφωνα με την Apple Developer Documentation (2025), το UIDocumentPickerViewController υποστηρίζει λειτουργίες import και export και επιστρέφει τα επιλεγμένα αρχεία ως URL μέσω του delegate.
Κύρια σημεία
UIDocumentPickerViewController — είναι ένας ελεγκτής UIKit που παρέχει διεπαφή συστήματος για την επιλογή εγγράφων. Αποτελεί μέρος του πλαισίου UIKit και είναι διαθέσιμο από το iOS 8. Ο ελεγκτής εμφανίζει ένα πρόγραμμα περιήγησης αρχείων που περιλαμβάνει τοπικό αποθηκευτικό χώρο, iCloud Drive και εγγεγραμμένες τρίτες υπηρεσίες cloud.
Ο ελεγκτής λειτουργεί ασύγχρονα: μετά την κλήση του present, ο χρήστης βλέπει έναν διάλογο συστήματος, επιλέγει το αρχείο και το αποτέλεσμα επιστρέφεται μέσω του delegate. Η εφαρμογή δεν απαιτεί ειδικές άδειες για πρόσβαση στο επιλεγμένο αρχείο — ο επιλογέας συστήματος παρέχει αυτόματα προσωρινή πρόσβαση στο URI.
Το UIDocumentPickerViewController υποστηρίζει iPad μέσω UIPopoverPresentationController και προσαρμοστική διεπαφή για iPhone. Από το iOS 14, ο ελεγκτής έλαβε ανανεωμένο σχεδιασμό και υποστήριξη πλοήγησης sidebar στο iPadOS.
UIDocumentPickerViewController λειτουργεί σε δύο κύριες λειτουργίες, καθεμία από τις οποίες καθορίζει πώς η εφαρμογή αποκτά πρόσβαση στο αρχείο. Η λειτουργία ορίζεται μέσω της παραμέτρου forOpeningContentTypes ή forExporting ανάλογα με την εργασία.
Λειτουργία Import (forOpeningContentTypes) αντιγράφει το επιλεγμένο αρχείο στο sandbox της εφαρμογής. Η εφαρμογή λαμβάνει το URL του δικού της αντιγράφου του αρχείου, προσβάσιμο μόνο σε αυτήν. Αυτή είναι μια ασφαλής λειτουργία: το αρχείο άλλης εφαρμογής δεν τροποποιείται και το αντίγραφο ελέγχεται πλήρως από την τρέχουσα εφαρμογή.
Λειτουργία Export (forExporting) παρέχει URL στο πρωτότυπο αρχείο χωρίς αντιγραφή. Η εφαρμογή μπορεί να διαβάσει το αρχείο μέσω του συνδέσμου, αλλά οι αλλαγές δεν αποθηκεύονται. Αυτή η λειτουργία χρησιμοποιείται όταν χρειάζεται να μεταφέρετε ένα αρχείο σε άλλη εφαρμογή ή να το στείλετε μέσω email. Για την εγγραφή αλλαγών χρησιμοποιείται η λειτουργία open με security-scoped URL.
UTI (Uniform Type Identifier) — είναι ένα σύστημα αναγνώρισης τύπων περιεχομένου στο οικοσύστημα της Apple. Το UIDocumentPickerViewController φιλτράρει τα εμφανιζόμενα αρχεία βάσει πίνακα UTI που μεταδίδεται μέσω forOpeningContentTypes. Εάν δεν έχει καθοριστεί UTI, ο επιλογέας εμφανίζει όλους τους τύπους αρχείων.
Για επιλογή πολλαπλών τύπων, μεταδίδεται ο πίνακας [UTType.pdf, UTType.image]. Από το iOS 14, η Apple συνιστά τη χρήση του UTType αντί για σταθερές συμβολοσειρών. Το UIDocumentPickerViewController ενημερώνει αυτόματα τη λίστα των εμφανιζόμενων τύπων όταν αλλάζει ο επιλεγμένος πάροχος.
Υλοποίηση του UIDocumentPickerViewController σε Swift είναι ελάχιστη: δημιουργήστε ένα στιγμιότυπο του ελεγκτή με τύπους UTI, ορίστε τον delegate και καλέστε το present. Μετά την επιλογή αρχείου, ο delegate λαμβάνει έναν πίνακα URL στη μέθοδο didPickDocumentsAt. Κάθε URL είναι ένας σύνδεσμος security-scoped που απαιτεί κλήση του startAccessingSecurityScopedResource.
let picker = UIDocumentPickerViewController(
forOpeningContentTypes: [.pdf, .image],
asCopy: true
)
picker.delegate = self
picker.allowsMultipleSelection = false
present(picker, animated: true)
// MARK: - UIDocumentPickerDelegate
func documentPicker(
_ controller: UIDocumentPickerViewController,
didPickDocumentsAt urls: [URL]
) {
guard let url = urls.first else { return }
url.startAccessingSecurityScopedResource()
defer { url.stopAccessingSecurityScopedResource() }
// ανάγνωση αρχείου από url
}
Το security-scoped URL απαιτεί κλήση του startAccessingSecurityScopedResource πριν από την ανάγνωση. Αυτή η μέθοδος ειδοποιεί το σύστημα ότι η εφαρμογή αποκτά προσωρινή πρόσβαση σε ένα αρχείο εκτός του sandbox. Μετά την ολοκλήρωση, φροντίστε να καλέσετε το stopAccessingSecurityScopedResource, διαφορετικά το σύστημα μπορεί να αποκλείσει την πρόσβαση.
UIDocumentPickerDelegate λαμβάνει τα αποτελέσματα επιλογής αρχείου μέσω δύο μεθόδων: didPickDocumentsAt σε επιτυχία και didPickDocumentsAt σε ακύρωση. Το iOS καλεί αυτόματα τη μέθοδο ακύρωσης εάν ο χρήστης έκλεισε τον επιλογέα χωρίς επιλογή.
Ο χειρισμός σφαλμάτων περιλαμβάνει έλεγχο διαθεσιμότητας του URL. Εάν ο χρήστης επέλεξε αρχείο από το iCloud Drive αλλά η συσκευή είναι εκτός σύνδεσης, το URL ενδέχεται να μην είναι διαθέσιμο. Συνιστάται ο έλεγχος του FileManager.default.isReadableFile πριν από την ανάγνωση και η εμφάνιση ενός κατανοητού μηνύματος σφάλματος.
Για iOS 14+ είναι διαθέσιμη η νέα μέθοδος documentPicker:didPickDocumentsAt με πίνακα URL. Η παλιά μέθοδος didPickDocumentAt (μεμονωμένη) είναι deprecated. Χειριστείτε πάντα τον πίνακα, ακόμη και αν το allowsMultipleSelection είναι απενεργοποιημένο — η Apple συνιστά τη χρήση ενιαίου χειριστή.
iPad απαιτεί ειδική διαμόρφωση του UIDocumentPickerViewController. Στο iPad, ο επιλογέας εμφανίζεται ως popover και απαιτεί τον καθορισμό sourceView για σωστή τοποθέτηση. Χωρίς sourceView, ο ελεγκτής μπορεί να καταρρεύσει με εξαίρεση στο iPadOS.
Για το popover, χρησιμοποιείται η ιδιότητα popoverPresentationController. Καθορίστε sourceView και sourceRect για σύνδεση σε κουμπί ή κελί πίνακα. Στο iPhone, αυτός ο κώδικας δεν έχει καμία επίδραση — το iOS εμφανίζει αυτόματα τον επιλογέα σε πλήρη οθόνη. Από το iPadOS 16, ο ελεγκτής υποστηρίζει sidebar και split view για βελτιωμένη πλοήγηση.
Ο προσαρμοστικός σχεδιασμός του UIDocumentPickerViewController αλλάζει αυτόματα μεταξύ full-screen (iPhone) και popover (iPad). Ο προγραμματιστής δεν χρειάζεται να υλοποιήσει ξεχωριστούς ελεγκτές για διαφορετικές συσκευές — αρκεί η σωστή διαμόρφωση του popoverPresentationController για το iPad.
Συχνές Ερωτήσεις
UIDocumentPickerViewController — είναι ένας ελεγκτής συστήματος UIKit για επιλογή εγγράφων από το iCloud Drive, τοπικό αποθηκευτικό χώρο και τρίτες υπηρεσίες cloud. Ο ελεγκτής επιστρέφει το URL του επιλεγμένου αρχείου μέσω του delegate.
Δημιουργήστε έναν ελεγκτή με forOpeningContentTypes: [.pdf]. Αυτό θα περιορίσει την εμφάνιση μόνο σε αρχεία PDF. Ορίστε τον delegate και καλέστε το present για να εμφανιστεί ο επιλογέας συστήματος.
Λειτουργία Import αντιγράφει το αρχείο στο sandbox της εφαρμογής — οι αλλαγές δεν επηρεάζουν το πρωτότυπο. Λειτουργία Export παρέχει URL στο πρωτότυπο αρχείο μόνο για ανάγνωση χωρίς αντιγραφή.
Security-scoped URL — είναι ένας σύνδεσμος προς ένα αρχείο εκτός του sandbox της εφαρμογής. Πριν από την ανάγνωση, καλέστε το startAccessingSecurityScopedResource, μετά την ολοκλήρωση — stopAccessingSecurityScopedResource.
Διαμορφώστε το popoverPresentationController με sourceView και sourceRect. Χωρίς αυτό, στο iPad ο ελεγκτής μπορεί να προκαλέσει εξαίρεση. Στο iPhone, οι ρυθμίσεις popover αγνοούνται — ο επιλογέας εμφανίζεται σε πλήρη οθόνη.
Περίληψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης