File Provider Extension — це механізм iOS, що дозволяє програмам надавати доступ до файлів із зовнішніх джерел через вбудований додаток Файли. Згідно з Apple Developer Documentation, 2024, File Provider Extension надає можливість відображати файли з хмарних сховищ, серверів та кастомних файлових систем безпосередньо в Files.app — без необхідності імпортувати їх локально. Користувач отримує єдиний інтерфейс для роботи з файлами незалежно від їхнього фізичного розташування.
Головне
File Provider Extension — це розширення програми в iOS та macOS, яке дозволяє програмі надавати доступ до файлів із зовнішніх джерел через системний додаток Файли. Воно з'явилося в iOS 11 і замінило механізм Document Provider, додавши підтримку синхронізації, пошуку та тегів.
Основне завдання File Provider Extension — виступати мостом між зовнішнім сховищем (хмарним сервером, корпоративним NAS, FTP) та Files.app. Користувач бачить файли та теки так, ніби вони зберігаються локально, хоча дані можуть знаходитися на віддаленому сервері. Розширення працює фоново, синхронізуючи вміст за потреби.
Згідно з WWDC 2024, Apple активно розвиває FileProvider API: додано підтримку інкрементальної синхронізації, покращено продуктивність для великих каталогів та з'явилася можливість групових операцій. Це робить File Provider Extension приладнішим способом інтеграції зовнішніх файлів у екосистему Apple.
Архітектура File Provider Extension складається з двох компонентів: основного розширення (тип постачальника файлів) та опційного UI-розширення для автентифікації та конфігурації. Основне розширення реалізує протокол NSFileProviderExtension та обробляє всі запити від Files.app.
import FileProvider
class CloudFileProvider: NSFileProviderExtension {
override func item(for identifier: NSFileProviderItemIdentifier) throws -> NSFileProviderItem {
guard let item = storage
.item(for: identifier) else {
throw NSError(domain: NSFileProviderErrorDomain,
code: NSFileProviderError.noSuchItem.rawValue)
}
return item
}
override func urlForItem(with identifier: NSFileProviderItemIdentifier) -> URL {
return fileCoordinator.urlForItem(with: identifier)
}
}
Коли користувач відкриває Files.app та вибирає вашого постачальника, система запускає розширення у фоновому процесі. Розширення не має інтерфейсу користувача — це безголовний процес, який обробляє запити на читання, запис, перейменування та видалення файлів. Усі операції виконуються асинхронно через NSFileProviderManager.
Важливий нюанс: File Provider Extension живе в окремому процесі і може бути завершена системою при нестачі пам'яті. Тому постачальник повинен вміти відновлювати стан після перезапуску, зберігаючи ідентифікатори та кеш синхронізації у постійному сховищі.
NSFileProviderItem — це протокол, який описує окремий файл або теку в ієрархії постачальника. Кожний елемент має унікальний ідентифікатор, ім'я, тип (файл або тека), дати створення та модифікації, розмір та прапорці (доступний офлайн, лише читання).
| Властивість | Тип | Опис |
|---|---|---|
| itemIdentifier | NSFileProviderItemIdentifier | Унікальний ID елемента в системі постачальника |
| parentItemIdentifier | NSFileProviderItemIdentifier | ID батьківської теки (корінь — .rootContainer) |
| filename | String | Ім'я файлу з розширенням |
| typeIdentifier | String (UTType) | Уніфікований ідентифікатор типу для визначення типу вмісту |
| capabilities | NSFileProviderItemCapabilities | Прапорці: видалення, перейменування, додавання тегів |
Протокол також підтримує розширені можливості через NSFileProviderItemProtocol: теги (кольорові мітки), іконки, версіонування та користувацькі дії. Для великих файлів реалізовано підтримку передачі, що підновлюються, через NSFileProviderService.
Згідно з WWDC 2023, Apple рекомендує використовувати замикання (NSFileProviderItemFields) для оновлення лише змінених властивостей замість цілого об'єкта. Це значно прискорює синхронізацію під час групових оновлень — наприклад, коли змінюється лише розмір групи файлів.
NSFileProviderManager — це центральний клас для керування життєвим циклом розширення. Він надає методи для сигналізації системі про зміни, обробки колаборативних конфліктів та керування завантаженнями. Менеджер автоматично відстежує активні передачі та надає пріоритет файлам, видимим користувачеві.
class SyncManager {
let providerManager = NSFileProviderManager.default
func signalUpdate(for item: NSFileProviderItemIdentifier) {
providerManager.signalEnumerator(
for: item.parentItemIdentifier
) { error in
if let error = error {
Logger.sync.error(
"Failed to signal: \(error.localizedDescription)"
)
}
}
}
func uploadItem(at url: URL, itemId: NSFileProviderItemIdentifier) {
providerManager.registerURLBasedItem(
with: itemId,
url: url
)
}
}
Рушій синхронізації — це логіка, яку розробник реалізує самостійно. Apple не надає вбудованого механізму синхронізації — лише API для сповіщення системі про зміни. Постачальник сам вирішує, як завантажувати файли з сервера, кешувати їх локально та вирішувати конфлікти редагування.
Конфлікти: система підтримує виявлення конфліктів версій через NSFileProviderSyncAnchor. Коли файл змінюється одночасно локально та віддалено, постачальник використовує якір синхронізації для визначення останньої синхронізованої версії та вирішує конфлікт за стратегією останній записувач перемагає або шляхом створення конфліктуючої копії.
File Provider Extension працює в суворій пісочниці (sandbox) iOS. Розширення не має прямого доступу до файлової системи програми-хоста, і навпаки — програма не може читати файли постачальника безпосередньо. Весь обмін даними відбувається через системні API Files.app.
Доступ до файлів користувача можливий лише через явну взаємодію: користувач відкриває файл з Files.app у програмі, і система створює тимчасову копію файлу в ізольованому контейнері. Програма-отримувач працює з цією копією, а не з оригіналом у сховищі постачальника.
Згідно з Apple Security Guide, 2024, постачальник зобов’язаний реалізувати шифрування даних під час передачі (TLS 1.3) та може опційно додати шифрування диска для кешованих файлів. Автентифікація користувача виконується через окремий компонент FileProviderUI, який працює поза пісочницею розширення для безпечного введення облікових даних.
Ключове обмеження: розширення не може виконувати довільний код — воно обробляє лише запити через NSFileProviderManager. Будь-яка логіка, що виходить за межі файлових операцій, повинна бути реалізована в основній програмі та викликатися через групи програм або XPC сервіси.
Часті запитання
File Provider Extension — це розширення програми для інтеграції зовнішнього файлового сховища з додатком Файли. Воно дозволяє відображати файли з хмарних сервісів, FTP, NAS та інших джерел без їх локального копіювання.
File Provider (iOS 11+) замінив Document Provider, додавши фонову синхронізацію, підтримку пошуку Spotlight, теги та покращену продуктивність. Document Provider вважався застарілим з iOS 11 та був видалений в iOS 14.
Синхронізація реалізується розробником через NSFileProviderManager. Розширення сигналізує системі про зміни через signalEnumerator, а система запитує оновлений список елементів. Конфлікти версій вирішуються через NSFileProviderSyncAnchor.
Так, File Provider Extension може працювати як незалежний процес без запущеної основної програми. Це безголовне розширення, яке iOS запускає за запитом Files.app. Однак автентифікація та початкове налаштування зазвичай виконуються через основну програму.
Розширення потребує capability File Provider в Xcode, а також entitlement com.apple.developer.file-provider. Для доступу до мережі додається capability Network. Решта прав жорстко обмежені пісочницею iOS.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також