File Provider Extension è un meccanismo iOS che consente alle applicazioni di fornire l'accesso a file da fonti esterne tramite l'app File integrata. Secondo Apple Developer Documentation, 2024, File Provider Extension consente di visualizzare i file da archivi cloud, server e file system personalizzati direttamente in Files.app — senza doverli importare localmente. L'utente ottiene un'interfaccia unificata per lavorare con i file indipendentemente dalla loro posizione fisica.
Punti chiave
File Provider Extension è un'estensione di app in iOS e macOS che consente a un'applicazione di fornire l'accesso a file da fonti esterne tramite l'app File di sistema. È stata introdotta in iOS 11 e ha sostituito il meccanismo Document Provider, aggiungendo il supporto per la sincronizzazione, la ricerca e i tag.
Il compito principale di File Provider Extension è fungere da ponte tra l'archiviazione esterna (server cloud, NAS aziendale, FTP) e Files.app. L'utente vede file e cartelle come se fossero archiviati localmente, sebbene i dati possano risiedere su un server remoto. L'estensione funziona in background, sincronizzando il contenuto secondo necessità.
Secondo la WWDC 2024, Apple sta sviluppando attivamente l'API FileProvider: è stato aggiunto il supporto per la sincronizzazione incrementale, le prestazioni per le directory di grandi dimensioni sono state migliorate e le operazioni batch sono ora disponibili. Questo rende File Provider Extension il metodo preferito per integrare file esterni nell'ecosistema Apple.
L'architettura di File Provider Extension è composta da due componenti: l'estensione principale (tipo fornitore di file) e un'estensione dell'interfaccia utente opzionale per l'autenticazione e la configurazione. L'estensione principale implementa il protocollo NSFileProviderExtension e gestisce tutte le richieste da 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)
}
}
Quando un utente apre Files.app e seleziona il tuo fornitore, il sistema avvia l'estensione in un processo in background. L'estensione non ha interfaccia utente — è un processo headless che gestisce le richieste di lettura, scrittura, ridenominazione ed eliminazione di file. Tutte le operazioni vengono eseguite in modo asincrono tramite NSFileProviderManager.
Sfumatura importante: File Provider Extension vive in un processo separato e può essere terminata dal sistema quando la memoria è scarsa. Pertanto, il fornitore deve essere in grado di ripristinare lo stato dopo un riavvio, salvando identificatori e cache di sincronizzazione nell'archivio persistente.
NSFileProviderItem è un protocollo che descrive un singolo file o cartella nella gerarchia del fornitore. Ogni elemento ha un identificatore univoco, nome, tipo (file o cartella), date di creazione e modifica, dimensione e flag (disponibile offline, sola lettura).
| Proprietà | Tipo | Descrizione |
|---|---|---|
| itemIdentifier | NSFileProviderItemIdentifier | ID univoco dell'elemento nel sistema del fornitore |
| parentItemIdentifier | NSFileProviderItemIdentifier | ID della cartella padre (radice — .rootContainer) |
| filename | String | Nome del file con estensione |
| typeIdentifier | String (UTType) | Identificatore di tipo uniforme per determinare il tipo di contenuto |
| capabilities | NSFileProviderItemCapabilities | Flag: eliminazione, ridenominazione, aggiunta di tag |
Il protocollo supporta anche capacità estese tramite NSFileProviderItemProtocol: tag (etichette colorate), icone, versionamento e azioni personalizzate. Per i file di grandi dimensioni, il supporto per i trasferimenti riprendibili è implementato tramite NSFileProviderService.
Secondo la WWDC 2023, Apple raccomanda di utilizzare le closure (NSFileProviderItemFields) per aggiornare solo le proprietà modificate anziché l'intero oggetto. Ciò accelera significativamente la sincronizzazione durante gli aggiornamenti batch — ad esempio, quando cambia solo la dimensione di un gruppo di file.
NSFileProviderManager è la classe centrale per la gestione del ciclo di vita dell'estensione. Fornisce metodi per segnalare al sistema le modifiche, gestire i conflitti collaborativi e gestire i download. Il manager tiene traccia automaticamente dei trasferimenti attivi e prioritizza i file visibili all'utente.
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
)
}
}
Il motore di sincronizzazione è la logica che lo sviluppatore implementa in modo indipendente. Apple non fornisce un meccanismo di sincronizzazione integrato — solo l'API per notificare al sistema le modifiche. Il fornitore decide autonomamente come scaricare i file dal server, memorizzarli nella cache locale e risolvere i conflitti di modifica.
Conflitti: il sistema supporta il rilevamento dei conflitti di versione tramite NSFileProviderSyncAnchor. Quando un file viene modificato contemporaneamente a livello locale e remoto, il fornitore utilizza l'ancora di sincronizzazione per determinare l'ultima versione sincronizzata e risolve il conflitto utilizzando una strategia di ultimo scrittore vince o creando una copia in conflitto.
File Provider Extension opera all'interno di una sandbox rigorosa di iOS. L'estensione non ha accesso diretto al file system dell'app host e, viceversa, l'app non può leggere direttamente i file del fornitore. Tutti gli scambi di dati avvengono tramite le API di sistema di Files.app.
L'accesso ai file dell'utente è possibile solo tramite interazione esplicita: l'utente apre un file da Files.app in un'applicazione e il sistema crea una copia temporanea del file in un contenitore isolato. L'app ricevente lavora con questa copia, non con l'originale nell'archivio del fornitore.
Secondo Apple Security Guide, 2024, il fornitore deve implementare la crittografia dei dati durante la trasmissione (TLS 1.3) e può opzionalmente aggiungere la crittografia del disco per i file memorizzati nella cache. L'autenticazione dell'utente viene eseguita tramite un componente FileProviderUI separato, che viene eseguito al di fuori della sandbox dell'estensione per l'immissione sicura delle credenziali.
Limitazione chiave: l'estensione non può eseguire codice arbitrario — elabora solo richieste tramite NSFileProviderManager. Qualsiasi logica oltre le operazioni sui file deve essere implementata nell'app principale e richiamata tramite gruppi di app o servizi XPC.
Domande frequenti
File Provider Extension è un'estensione di app per integrare l'archiviazione esterna di file con l'app File. Consente di visualizzare file da servizi cloud, FTP, NAS e altre fonti senza copiarli localmente.
File Provider (iOS 11+) ha sostituito Document Provider, aggiungendo sincronizzazione in background, supporto per la ricerca Spotlight, tag e prestazioni migliorate. Document Provider è stato deprecato con iOS 11 e rimosso in iOS 14.
La sincronizzazione è implementata dallo sviluppatore tramite NSFileProviderManager. L'estensione segnala al sistema le modifiche tramite signalEnumerator e il sistema richiede un elenco aggiornato degli elementi. I conflitti di versione vengono risolti tramite NSFileProviderSyncAnchor.
Sì, File Provider Extension può funzionare come processo indipendente senza che l'app principale sia in esecuzione. È un'estensione headless che iOS avvia su richiesta di Files.app. Tuttavia, l'autenticazione e la configurazione iniziale vengono solitamente eseguite tramite l'app principale.
L'estensione richiede la capacità File Provider in Xcode, nonché l'entitlement com.apple.developer.file-provider. Per l'accesso alla rete, viene aggiunta la capacità Network. Tutti gli altri diritti sono strettamente limitati dalla sandbox iOS.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche