UIDocumentPickerViewController — это системный контроллер iOS для выбора документов из файловой системы, iCloud Drive и сторонних облачных хранилищ. Контроллер предоставляет единый интерфейс открытия и импорта файлов любых типов: изображений, PDF, текстов и аудио. По данным Apple Developer Documentation (2025), UIDocumentPickerViewController поддерживает режимы import и export и возвращает выбранные файлы в виде URL-ссылок через делегата.
Главное
UIDocumentPickerViewController — это контроллер UIKit, предоставляющий системный интерфейс для выбора документов. Он входит в фреймворк UIKit и доступен начиная с iOS 8. Контроллер отображает браузер файлов, который включает локальное хранилище, iCloud Drive и зарегистрированные сторонние облачные сервисы.
Контроллер работает асинхронно: после вызова present пользователь видит системный диалог, выбирает файл, и результат возвращается через делегата. Приложение не требует специальных разрешений для доступа к выбранному файлу — системный пикер автоматически предоставляет временный доступ к URI.
UIDocumentPickerViewController поддерживает iPad через UIPopoverPresentationController и адаптивный интерфейс для iPhone. Начиная с iOS 14, контроллер получил обновлённый дизайн и поддержку sidebar-навигации в iPadOS.
UIDocumentPickerViewController работает в двух основных режимах, каждый из которых определяет, как приложение получает доступ к файлу. Режим задаётся через параметр forOpeningContentTypes или forExporting в зависимости от задачи.
Import mode (forOpeningContentTypes) копирует выбранный файл в песочницу приложения. Приложение получает URL на собственную копию файла, доступную только ему. Это безопасный режим: файл другого приложения не изменяется, а копия полностью контролируется текущим приложением.
Export mode (forExporting) предоставляет URL на оригинальный файл без копирования. Приложение может читать файл по ссылке, но изменения не сохраняются обратно. Этот режим используется, когда нужно передать файл другому приложению или отправить по почте. Для записи изменений используется режим open с scoped security-scoped URL.
UTI (Uniform Type Identifier) — это система идентификации типов контента в Apple экосистеме. UIDocumentPickerViewController фильтрует отображаемые файлы по массиву UTI, переданному через forOpeningContentTypes. Если UTI не указан, пикер показывает все типы файлов.
Для выбора нескольких типов передаётся массив [UTType.pdf, UTType.image]. Начиная с iOS 14, Apple рекомендует использовать UTType вместо строковых констанл. UIDocumentPickerViewController автоматически обновляет список отображаемых типов при изменении выбранного провайдера.
Реализация UIDocumentPickerViewController на Swift минимальна: создать экземпляр контроллера с UTI-типами, установить делегата и вызвать present. После выбора файла делегат получает массив 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() }
// read file from url
}
Security-scoped URL требует вызова startAccessingSecurityScopedResource перед чтением. Этот метод сообщает системе, что приложение получает временный доступ к файлу за пределами песочницы. После завершения работы обязательно вызывайте 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 контроллер может упасть с exception на iPadOS.
Для popover используется свойство popoverPresentationController. Укажите sourceView и sourceRect для привязки к кнопке или ячейке таблицы. На iPhone этот код не влияет — iOS автоматически показывает пикер на весь экран. Начиная с iPadOS 16, контроллер поддерживает sidebar и split view для улучшенной навигации.
Адаптивный дизайн UIDocumentPickerViewController автоматически переключается между full-screen (iPhone) и popover (iPad). Разработчику не нужно реализовывать отдельные контроллеры для разных устройств — достаточно корректно настроить popoverPresentationController для iPad.
Часто задаваемые вопросы
UIDocumentPickerViewController — это системный контроллер UIKit для выбора документов из iCloud Drive, локального хранилища и сторонних облачных сервисов. Контроллер возвращает URL выбранного файла через делегата.
Создайте контроллер с forOpeningContentTypes: [.pdf]. Это ограничит отображение только PDF-файлами. Установите делегата и вызовите present для отображения системного пикера.
Import mode копирует файл в песочницу приложения — изменения не влияют на оригинал. Export mode предоставляет URL на оригинальный файл только для чтения без копирования.
Security-scoped URL — это ссылка на файл за пределами песочницы приложения. Перед чтением вызовите startAccessingSecurityScopedResource, после завершения — stopAccessingSecurityScopedResource.
Настройте popoverPresentationController с sourceView и sourceRect. Без этого на iPad контроллер может вызвать exception. На iPhone настройки popover игнорируются — пикер отображается на весь экран.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также