Share Extension è un'estensione iOS che aggiunge la tua app al menu Condividi di sistema. L'utente può inviare contenuti da Safari, Foto, File o qualsiasi altra app direttamente nella tua — senza copiare e passare da una finestra all'altra. Secondo Apple (2024), le app con Share Extension ricevono il 35% in più di contenuti utente rispetto alle app senza funzionalità di condivisione. L'estensione elabora testo, immagini, video, URL e file tramite un'interfaccia unificata NSExtensionItem.
Punti chiave
Share Extension è un tipo di estensione iOS che appare nel menu Condividi di sistema quando si seleziona contenuto in qualsiasi app. L'utente evidenzia testo in Safari, tocca Condividi e vede la tua app nell'elenco delle azioni disponibili. Dopo la selezione, il contenuto viene passato all'estensione per l'elaborazione: salvataggio, pubblicazione, invio o trasformazione.
A differenza di Action Extension, Share Extension è specializzata nella ricezione di contenuti da app esterne. Action Extension, invece, invia dati dalla tua app verso l'esterno. Share Extension è un punto di ingresso per i contenuti utente, un elemento chiave per l'acquisizione utenti: gli utenti provano la tua app tramite Share Extension senza installarla completamente. L'App Store vieta le app la cui unica funzione è mostrare pubblicità tramite Share Extension (App Store Review Guideline 4.2).
Share Extension abbassa la barriera d'ingresso: gli utenti inviano contenuti alla tua app da un contesto familiare — browser, galleria, file manager. Secondo Branch (2024), le app con Share Extension mostrano una fidelizzazione del 28% superiore al 7° giorno. Un effetto aggiuntivo è la viralità: ogni volta che un utente vede la tua app nel foglio Condividi, si verifica un branding passivo senza spese pubblicitarie.
Il meccanismo di Share Extension si basa sul trasferimento di contenuti tramite contenitori di sistema NSExtensionItem. L'app host (Safari, Foto) impacchetta il contenuto selezionato in un NSExtensionItem con un tipo specificato (public.image, public.url, public.plain-text). Il sistema passa questo contenitore all'estensione, che estrae i dati tramite extensionContext.inputItems.
Share Extension viene eseguita in un processo separato con tempo di esecuzione limitato — circa 30 secondi per l'elaborazione. L'estensione non deve eseguire operazioni sincrone lunghe. Per caricare file grandi, utilizza NSURLSession con configurazione in background. SLComposeServiceViewController è la classe base per Share Extension con anteprima del contenuto e pulsante di invio.
iOS utilizza Uniform Type Identifiers (UTI) per determinare il tipo di contenuto trasferito. UTI principali per Share Extension: public.image (foto, screenshot), public.url (link), public.plain-text (testo), public.video (file video) e public.file-url (file). L'estensione registra le UTI supportate in Info.plist tramite la chiave NSExtensionActivationRule.
Share Extension è composta da tre componenti: il target in Xcode, SLComposeServiceViewController e la configurazione Info.plist. L'architettura determina quali tipi di contenuto vengono elaborati, come viene visualizzata l'interfaccia e dove vengono salvati i dati.
| Componente | Scopo | Caratteristiche |
|---|---|---|
| Target | Target dell'estensione in Xcode | Bundle separato con un identificatore |
| ViewController | Interfaccia e logica di elaborazione | SLComposeServiceViewController o personalizzato |
| Info.plist | Configurazione di attivazione e UTI | NSExtensionActivationRule con predicati |
| App Groups | Archiviazione condivisa con l'app | UserDefaults suite per il trasferimento dati |
L'elemento chiave della configurazione di Share Extension è la regola di attivazione. Determina in quali condizioni l'estensione appare nel foglio Condividi. La regola viene impostata in Info.plist come dizionario con vincoli: numero massimo di immagini, lunghezza minima del testo, presenza obbligatoria di URL. La regola standard attiva l'estensione per un qualsiasi singolo tipo di contenuto.
// Info.plist — NSExtensionActivationRule per Share Extension
<key>NSExtensionActivationRule</key>
<dict>
<key>NSExtensionActivationSupportsImageWithMaxCount</key>
<integer>5</integer>
<key>NSExtensionActivationSupportsText</key>
<true/>
<key>NSExtensionActivationSupportsWebURLWithMaxCount</key>
<integer>1</integer>
</dict>
Consideriamo un esempio pratico di creazione di una Share Extension in Swift per un'app di segnalibri. L'estensione riceve un URL da Safari, mostra un'interfaccia di anteprima e salva il link in App Group. SLComposeServiceViewController fornisce un'interfaccia utente pronta con un campo di testo e un pulsante Pubblica.
import Social
import MobileCoreServices
class ShareViewController: SLComposeServiceViewController {
override func isContentValid() -> Bool {
return !(contentText?.isEmpty() ?? true)
}
override func didSelectPost() {
guard let item = extensionContext?.inputItems.first as? NSExtensionItem
else { return }
for attachment in item.attachments ?? [] {
attachment.loadItem(forTypeIdentifier: kUTTypeURL as String) {
[weak self] (item, error) in
if let url = item as? URL {
BookmarkService().save(url, title: self?.contentText)
}
self?.extensionContext?.completeRequest(
returningItems: [], completionHandler: nil)
}
}
}
}
Dopo l'invio del contenuto, l'estensione termina chiamando completeRequest — questo è un passaggio obbligatorio; senza di esso, il sistema non rilascerà il processo dell'estensione. Importante: Share Extension viene eseguita in un ambiente limitato con accesso limitato alla rete e al file system — utilizza sessioni in background per il caricamento di contenuti.
Share Extension deve gestire correttamente diversi tipi di dati in ingresso: testo, immagini, video, URL e file. Ogni tipo utilizza la propria UTI e metodo di estrazione. Gestione universale — iterando su attachment.attachments con controlli hasItemConformingToTypeIdentifier.
Le immagini vengono passate come public.image con la possibilità di recuperarle tramite UIImage o Data. Per immagini grandi, utilizza jpegData(compressionQuality:) prima del salvataggio. Share Extension non deve modificare l'immagine originale senza esplicita autorizzazione dell'utente. Si consiglia di salvare l'originale in App Group e creare un'anteprima per la visualizzazione nell'interfaccia.
Safari e altri browser passano gli URL come public.url e il testo selezionato come public.plain-text. Un singolo NSExtensionItem può contenere entrambi i tipi simultaneamente — l'URL della pagina e il testo selezionato su di essa. Share Extension deve controllare tutti gli allegati ed estrarre i dati rilevanti. Scenario combinato: salvare l'URL come segnalibro e il testo come nota allegata.
Share Extension e l'app principale vengono eseguite in processi diversi e non hanno accesso condiviso al file system. Lo scambio di dati utilizza il meccanismo degli App Groups: un contenitore condiviso con un identificatore group.*. Dopo aver salvato i dati in App Group, l'estensione notifica l'app tramite CFNotificationCenter o Darwin Notify.
Gli App Groups vengono attivati nelle Capabilities del target: seleziona App Groups e aggiungi un identificatore (ad esempio, group.com.example.myapp). Entrambi i target — l'app principale e l'estensione — devono avere accesso allo stesso gruppo. UserDefaults suite consente di leggere e scrivere dati nell'archiviazione condivisa con overhead minimo.
// Salvataggio dati in App Group da Share Extension
let sharedDefaults = UserDefaults(suiteName: "group.com.example.myapp")
let bookmark: [String: Any] = [
"url": url.absoluteString,
"title": contentText ?? "",
"date": Date().timeIntervalSince1970
]
sharedDefaults?.set(bookmark, forKey: "bookmark_\(Date().timeIntervalSince1970)")
sharedDefaults?.synchronize()
Domande frequenti
Share Extension riceve contenuti da altre app nella tua. Action Extension, invece, esegue un'azione sul contenuto all'interno dell'app host — tradurre testo, modificare un'immagine. Share Extension è ricezione, Action Extension è trasformazione.
Dipende dal tipo di contenuto che la tua app elabora. Per i segnalibri — public.url. Per un editor di foto — public.image. Per le note — public.plain-text. Per più tipi, utilizza NSExtensionActivationRule con una combinazione di predicati AND/OR.
Una causa comune è una regola NSExtensionActivationRule errata o una discrepanza di UTI. Verifica in Info.plist: la regola di attivazione deve corrispondere al tipo di contenuto testato. Assicurati anche che l'estensione sia abilitata in Impostazioni → la tua app → Siri e Ricerca. Xcode clean build spesso risolve il problema.
Il sistema assegna circa 30 secondi per l'esecuzione. Dopodiché, iOS termina forzatamente il processo dell'estensione. Per operazioni di lunga durata, utilizza una NSURLSession in background e gestisci il risultato al prossimo avvio dell'app.
Sì, invece di SLComposeServiceViewController puoi utilizzare un UIViewController normale. In questo caso, hai il controllo completo dell'interfaccia. Tuttavia, devi implementare tu stesso i pulsanti di invio e annullamento. Interfaccia personalizzata è consigliata per scenari di elaborazione contenuti non standard.
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