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 и избере вашия доставчик, системата стартира разширението във фонов процес. Разширението няма потребителски интерфейс — това е headless процес, който обработва заявки за четене, запис, преименуване и изтриване на файлове. Всички операции се изпълняват асинхронно чрез NSFileProviderManager.
Важна забележка: File Provider Extension живее в отделен процес и може да бъде прекратен от системата при недостиг на памет. Поради това доставчикът трябва да може да възстанови състоянието след рестарт, запазвайки идентификатори и кеш за синхронизиране в постоянно хранилище.
NSFileProviderItem е протокол, който описва отделен файл или папка в йерархията на доставчика. Всеки елемент има уникален идентификатор, име, тип (файл или папка), дати на създаване и модификация, размер и флагове (достъпен офлайн, само за четене).
| Свойство | Тип | Описание |
|---|---|---|
| itemIdentifier | NSFileProviderItemIdentifier | Уникален ID на елемента в системата на доставчика |
| parentItemIdentifier | NSFileProviderItemIdentifier | ID на родителската папка (корен — .rootContainer) |
| filename | String | Име на файла с разширение |
| typeIdentifier | String (UTType) | Uniform Type Identifier за определяне на типа съдържание |
| capabilities | NSFileProviderItemCapabilities | Флагове: изтриване, преименуване, добавяне на етикети |
Протоколът също поддържа разширени възможности чрез NSFileProviderItemProtocol: етикети (цветни маркери), икони, версиониране и персонализирани действия. За големи файлове се имплементира поддръжка за възобновяеми трансфери (resumable transfers) чрез 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) и може опционално да добави криптиране на диска за кеширани файлове. Удостоверяването на потребителя се извършва чрез отделен UI компонент FileProviderUI, който се стартира извън пясъчната кутия на разширението за безопасно въвеждане на идентификационни данни.
Ключово ограничение: разширението не може да изпълнява произволен код — обработва само заявки чрез NSFileProviderManager. Всяка логика, която излиза извън рамките на файловите операции, трябва да бъде имплементирана в основното приложение и извикана чрез app groups или XPC services.
Често задавани въпроси
File Provider Extension е разширение на приложение за интегриране на външни файлови хранилища с приложението Файлове. Позволява показване на файлове от облачни услуги, FTP, NAS и други източници без тяхното локално копиране.
File Provider (iOS 11+) замени Document Provider, добавяйки фоново синхронизиране, поддръжка за търсене чрез Spotlight, етикети и подобрена производителност. Document Provider се смяташе за остарял от iOS 11 и беше премахнат в iOS 14.
Синхронизирането се имплементира от разработчика чрез NSFileProviderManager. Разширението сигнализира на системата за промени чрез signalEnumerator, а системата изисква актуализиран списък с елементи. Версионните конфликти се разрешават чрез NSFileProviderSyncAnchor.
Да, File Provider Extension може да работи като самостоятелен процес без стартирано основно приложение. Това е headless разширение, което iOS стартира по заявка на Files.app. Въпреки това, удостоверяването и началната конфигурация обикновено се извършват чрез основното приложение.
Разширението изисква capability File Provider в Xcode, както и entitlement com.apple.developer.file-provider. За достъп до мрежа се добавя capability Network. Всички останали права са строго ограничени от пясъчната кутия на iOS.
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също