UIDocumentPickerViewController — to systemowy kontroler iOS do wybierania dokumentów z systemu plików, iCloud Drive i zewnętrznych magazynów w chmurze. Kontroler zapewnia jednolity interfejs otwierania i importowania plików dowolnego typu: obrazów, PDF, tekstów i audio. Według Apple Developer Documentation (2025), UIDocumentPickerViewController obsługuje tryby import i export i zwraca wybrane pliki jako URL-e przez delegata.
Najważniejsze
UIDocumentPickerViewController — to kontroler UIKit zapewniający systemowy interfejs do wyboru dokumentów. Należy do frameworka UIKit i jest dostępny od iOS 8. Kontroler wyświetla przeglądarkę plików, która obejmuje magazyn lokalny, iCloud Drive i zarejestrowane zewnętrzne usługi chmurowe.
Kontroler działa asynchronicznie: po wywołaniu present użytkownik widzi systemowy dialog, wybiera plik, a wynik jest zwracany przez delegata. Aplikacja nie wymaga specjalnych uprawnień dostępu do wybranego pliku — systemowy picker automatycznie udostępnia tymczasowy dostęp do URI.
UIDocumentPickerViewController obsługuje iPad przez UIPopoverPresentationController i adaptacyjny interfejs dla iPhone. Od iOS 14 kontroler otrzymał zaktualizowany design i obsługę nawigacji sidebar w iPadOS.
UIDocumentPickerViewController działa w dwóch głównych trybach, z których każdy określa, w jaki sposób aplikacja uzyskuje dostęp do pliku. Tryb jest ustawiany przez parametr forOpeningContentTypes lub forExporting w zależności od zadania.
Tryb import (forOpeningContentTypes) kopiuje wybrany plik do piaskownicy aplikacji. Aplikacja otrzymuje URL do własnej kopii pliku, dostępnej tylko dla niej. Jest to bezpieczny tryb: plik innej aplikacji nie jest modyfikowany, a kopia jest w pełni kontrolowana przez bieżącą aplikację.
Tryb export (forExporting) udostępnia URL do oryginalnego pliku bez kopiowania. Aplikacja może czytać plik pod linkiem, ale zmiany nie są zapisywane. Ten tryb jest używany, gdy trzeba przekazać plik innej aplikacji lub wysłać go pocztą. Do zapisywania zmian używany jest tryb open z zakresem security-scoped URL.
UTI (Uniform Type Identifier) — to system identyfikacji typów treści w ekosystemie Apple. UIDocumentPickerViewController filtruje wyświetlane pliki według tablicy UTI przekazanej przez forOpeningContentTypes. Jeśli UTI nie jest określony, picker pokazuje wszystkie typy plików.
Do wyboru wielu typów przekazywana jest tablica [UTType.pdf, UTType.image]. Od iOS 14 Apple zaleca używanie UTType zamiast stałych łańcuchowych. UIDocumentPickerViewController automatycznie aktualizuje listę wyświetlanych typów przy zmianie wybranego dostawcy.
Implementacja UIDocumentPickerViewController w Swift jest minimalna: utwórz instancję kontrolera z typami UTI, ustaw delegata i wywołaj present. Po wyborze pliku delegat otrzymuje tablicę URL w metodzie didPickDocumentsAt. Każdy URL to security-scoped link wymagający wywołania 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() }
// odczytaj plik z adresu URL
}
Security-scoped URL wymaga wywołania startAccessingSecurityScopedResource przed odczytem. Ta metoda informuje system, że aplikacja uzyskuje tymczasowy dostęp do pliku poza piaskownicą. Po zakończeniu pracy koniecznie wywołaj stopAccessingSecurityScopedResource, w przeciwnym razie system może zablokować dostęp.
UIDocumentPickerDelegate otrzymuje wyniki wyboru pliku przez dwie metody: didPickDocumentsAt przy sukcesie i didPickDocumentsAt przy anulowaniu. iOS automatycznie wywołuje metodę anulowania, jeśli użytkownik zamknął picker bez wyboru.
Obsługa błędów obejmuje sprawdzanie dostępności URL. Jeśli użytkownik wybrał plik z iCloud Drive, ale urządzenie jest offline, URL może być niedostępny. Zaleca się sprawdzanie FileManager.default.isReadableFile przed odczytem i wyświetlanie użytkownikowi zrozumiałego komunikatu błędu.
Dla iOS 14+ dostępna jest nowa metoda documentPicker:didPickDocumentsAt z tablicą URL. Stara metoda didPickDocumentAt (pojedyncza) jest deprecated. Zawsze obsługuj tablicę, nawet jeśli allowsMultipleSelection jest wyłączone — Apple zaleca używanie jednolitego handlera.
iPad wymaga specjalnej konfiguracji UIDocumentPickerViewController. Na iPadzie picker wyświetla się jako popover i wymaga określenia sourceView dla prawidłowego pozycjonowania. Bez sourceView kontroler może spaść z exception na iPadOS.
Dla popover używana jest właściwość popoverPresentationController. Określ sourceView i sourceRect dla przypięcia do przycisku lub komórki tabeli. Na iPhone ten kod nie ma wpływu — iOS automatycznie pokazuje picker na pełnym ekranie. Od iPadOS 16 kontroler obsługuje sidebar i split view dla ulepszonej nawigacji.
Adaptacyjny design UIDocumentPickerViewController automatycznie przełącza się między full-screen (iPhone) a popover (iPad). Deweloper nie musi implementować oddzielnych kontrolerów dla różnych urządzeń — wystarczy poprawnie skonfigurować popoverPresentationController dla iPada.
Często zadawane pytania
UIDocumentPickerViewController — to systemowy kontroler UIKit do wyboru dokumentów z iCloud Drive, magazynu lokalnego i zewnętrznych usług chmurowych. Kontroler zwraca URL wybranego pliku przez delegata.
Utwórz kontroler z forOpeningContentTypes: [.pdf]. To ograniczy wyświetlanie tylko do plików PDF. Ustaw delegata i wywołaj present, aby wyświetlić systemowy picker.
Tryb import kopiuje plik do piaskownicy aplikacji — zmiany nie wpływają na oryginał. Tryb export udostępnia URL do oryginalnego pliku tylko do odczytu bez kopiowania.
Security-scoped URL — to link do pliku poza piaskownicą aplikacji. Przed odczytem wywołaj startAccessingSecurityScopedResource, po zakończeniu — stopAccessingSecurityScopedResource.
Skonfiguruj popoverPresentationController z sourceView i sourceRect. Bez tego na iPadzie kontroler może wywołać exception. Na iPhone ustawienia popover są ignorowane — picker wyświetla się na pełnym ekranie.
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ż