File Provider Extension to mechanizm iOS, który pozwala aplikacjom udostępniać pliki z zewnętrznych źródeł za pomocą wbudowanej aplikacji Pliki. Według Apple Developer Documentation, 2024, File Provider Extension umożliwia wyświetlanie plików z chmur, serwerów i niestandardowych systemów plików bezpośrednio w Files.app — bez konieczności ich lokalnego importowania. Użytkownik otrzymuje jeden interfejs do pracy z plikami niezależnie od ich fizycznej lokalizacji.
Najważniejsze
File Provider Extension to rozszerzenie aplikacji w iOS i macOS, które pozwala aplikacji udostępniać pliki z zewnętrznych źródeł za pośrednictwem systemowej aplikacji Pliki. Pojawiło się w iOS 11 i zastąpiło mechanizm Document Provider, dodając obsługę synchronizacji, wyszukiwania i tagów.
Głównym zadaniem File Provider Extension jest działanie jako most między zewnętrznym magazynem (serwerem chmurowym, korporacyjnym NAS, FTP) a Files.app. Użytkownik widzi pliki i foldery tak, jakby były przechowywane lokalnie, chociaż w rzeczywistości dane mogą znajdować się na zdalnym serwerze. Rozszerzenie działa w tle, synchronizując zawartość w miarę potrzeb.
Według WWDC 2024, Apple aktywnie rozwija FileProvider API: dodano obsługę synchronizacji przyrostowej, poprawiono wydajność dla dużych katalogów i dodano możliwość operacji grupowych. To sprawia, że File Provider Extension jest preferowanym sposobem integracji zewnętrznych plików w ekosystemie Apple.
Architektura File Provider Extension składa się z dwóch komponentów: głównego rozszerzenia (typ dostawcy plików) i opcjonalnego rozszerzenia UI do uwierzytelniania i konfiguracji. Główne rozszerzenie implementuje protokół NSFileProviderExtension i obsługuje wszystkie żądania z 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)
}
}
Gdy użytkownik otwiera Files.app i wybiera twojego dostawcę, system uruchamia rozszerzenie w procesie tła. Rozszerzenie nie ma interfejsu użytkownika — to proces headless, który obsługuje żądania odczytu, zapisu, zmiany nazwy i usuwania plików. Wszystkie operacje są wykonywane asynchronicznie przez NSFileProviderManager.
Ważna uwaga: File Provider Extension działa w oddzielnym procesie i może zostać zakończone przez system przy braku pamięci. Dlatego dostawca musi umieć przywracać stan po restarcie, zapisując identyfikatory i pamięć podręczną synchronizacji w stałym magazynie.
NSFileProviderItem to protokół opisujący pojedynczy plik lub folder w hierarchii dostawcy. Każdy element ma unikalny identyfikator, nazwę, typ (plik lub folder), daty utworzenia i modyfikacji, rozmiar oraz flagi (dostępny offline, tylko do odczytu).
| Właściwość | Typ | Opis |
|---|---|---|
| itemIdentifier | NSFileProviderItemIdentifier | Unikalny ID elementu w systemie dostawcy |
| parentItemIdentifier | NSFileProviderItemIdentifier | ID folderu nadrzędnego (root — .rootContainer) |
| filename | String | Nazwa pliku z rozszerzeniem |
| typeIdentifier | String (UTType) | Uniform Type Identifier do określenia typu zawartości |
| capabilities | NSFileProviderItemCapabilities | Flagi: usuwanie, zmiana nazwy, dodawanie tagów |
Protokół obsługuje również zaawansowane możliwości przez NSFileProviderItemProtocol: tagi (kolorowe etykiety), ikony, wersjonowanie i niestandardowe akcje. Dla dużych plików implementowana jest obsługa wznawiania transferów (resumable transfers) przez NSFileProviderService.
Według WWDC 2023, Apple zaleca używanie zamknięć (NSFileProviderItemFields) do aktualizacji tylko zmienionych właściwości, a nie całego obiektu. To znacznie przyspiesza synchronizację przy aktualizacjach zbiorczych — na przykład gdy zmienia się tylko rozmiar grupy plików.
NSFileProviderManager — centralna klasa do zarządzania cyklem życia rozszerzenia. Zapewnia metody do sygnalizowania systemowi zmian, obsługi konfliktów współpracy i zarządzania pobieraniem. Menedżer automatycznie śledzi aktywne transfery i priorytetyzuje pliki widoczne dla użytkownika.
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
)
}
}
Silnik synchronizacji to logika, którą programista implementuje samodzielnie. Apple nie zapewnia wbudowanego mechanizmu synchronizacji — tylko API do powiadamiania systemu o zmianach. Dostawca sam decyduje, jak pobierać pliki z serwera, buforować je lokalnie i rozwiązywać konflikty edycji.
Konflikty: system obsługuje wykrywanie konfliktów wersji przez NSFileProviderSyncAnchor. Gdy plik jest zmieniany jednocześnie lokalnie i zdalnie, dostawca używa kotwicy synchronizacji do określenia ostatniej zsynchronizowanej wersji i rozwiązania konfliktu według strategii „ostatni zapis wygrywa” lub przez utworzenie kopii konfliktowej.
File Provider Extension działa w ścisłej piaskownicy (sandbox) iOS. Rozszerzenie nie ma bezpośredniego dostępu do systemu plików aplikacji-host i odwrotnie — aplikacja nie może bezpośrednio odczytywać plików dostawcy. Cała wymiana danych odbywa się przez systemowe API Files.app.
Dostęp do plików użytkownika jest możliwy tylko przez jawną interakcję: użytkownik otwiera plik z Files.app w aplikacji, a system tworzy tymczasową kopię pliku w izolowanym kontenerze. Aplikacja-odbiorca pracuje z tą kopią, a nie z oryginałem w magazynie dostawcy.
Według Apple Security Guide, 2024, dostawca musi zaimplementować szyfrowanie danych podczas transmisji (TLS 1.3) i może opcjonalnie dodać szyfrowanie dysku dla buforowanych plików. Uwierzytelnianie użytkownika odbywa się przez oddzielny komponent UI FileProviderUI, który jest uruchamiany poza piaskownicą rozszerzenia w celu bezpiecznego wprowadzania danych uwierzytelniających.
Kluczowe ograniczenie: rozszerzenie nie może uruchamiać dowolnego kodu — obsługuje tylko żądania przez NSFileProviderManager. Każda logika wykraczająca poza operacje na plikach musi być zaimplementowana w głównej aplikacji i wywoływana przez app groups lub XPC services.
Często zadawane pytania
File Provider Extension to rozszerzenie aplikacji do integracji zewnętrznych magazynów plików z aplikacją Pliki. Umożliwia wyświetlanie plików z usług chmurowych, FTP, NAS i innych źródeł bez ich lokalnego kopiowania.
File Provider (iOS 11+) zastąpił Document Provider, dodając synchronizację w tle, obsługę wyszukiwania przez Spotlight, tagi i lepszą wydajność. Document Provider był uznawany za przestarzały od iOS 11 i usunięty w iOS 14.
Synchronizacja jest implementowana przez programistę za pomocą NSFileProviderManager. Rozszerzenie sygnalizuje systemowi zmiany przez signalEnumerator, a system żąda zaktualizowanej listy elementów. Konflikty wersji są rozwiązywane przez NSFileProviderSyncAnchor.
Tak, File Provider Extension może działać jako samodzielny proces bez uruchomionej głównej aplikacji. To rozszerzenie headless, które iOS uruchamia na żądanie Files.app. Jednak uwierzytelnianie i wstępna konfiguracja zwykle są wykonywane przez główną aplikację.
Rozszerzenie wymaga capability File Provider w Xcode oraz entitlements com.apple.developer.file-provider. Do dostępu do sieci dodaje się capability Network. Wszystkie inne uprawnienia są ściśle ograniczone przez piaskownicę iOS.
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ż