Action Extension è un'estensione iOS che esegue azioni personalizzate su contenuti da altre app senza cambiare contesto. A differenza di Share Extension, che invia dati a un'altra app, Action Extension trasforma il contenuto sul posto: traduce testo, cambia filtri immagine, controlla l'ortografia o genera PDF. Secondo Apple (2024), Action Extension è il secondo tipo di estensione più popolare dopo Share Extension, utilizzato nel 42% delle app della categoria “Produttività”. L'azione istantanea senza avviare l'app principale è il vantaggio chiave per l'utente.
Punti chiave
Action Extension è un tipo di estensione iOS che consente di eseguire azioni sul contenuto direttamente nel contesto dell'app host. L'utente seleziona del testo in Safari, tocca “Azioni” e sceglie, ad esempio, “Controlla ortografia” — l'estensione elabora il testo e restituisce il risultato senza uscire dal browser. L'estensione riceve i dati di input tramite NSExtensionContext e può restituire contenuti modificati.
Action Extension è apparsa in iOS 8 come parte dell'architettura delle estensioni delle app. La sua caratteristica principale è che l'estensione non ha una propria interfaccia (opzionale) e viene eseguita nel contesto dell'app host. L'utente non lascia la schermata corrente, garantendo un attrito cognitivo minimo. Secondo Apple, Action Extension è l'unico tipo di estensione che può leggere e modificare simultaneamente il contenuto dell'app host (tramite NSExtensionContext con restituzione del risultato).
Action Extension viene utilizzata in vari scenari: tradurre testo nel browser, creare PDF da una pagina web, applicare un filtro a una foto nella galleria, controllare l'ortografia in qualsiasi campo di testo, accorciare URL, crittografare testo e aggiungere segnalibri. La versatilità rende Action Extension uno strumento popolare per le app delle categorie “Utilità” e “Produttività”.
Action Extension e Share Extension vengono spesso confuse, ma i loro scopi sono fondamentalmente diversi. Share Extension invia contenuti dall'app host alla tua app; Action Extension elabora i contenuti e li restituisce. La differenza influisce sull'architettura, sull'esperienza utente e sui requisiti di configurazione di Info.plist.
| Caratteristica | Action Extension | Share Extension |
|---|---|---|
| Scopo | Trasformazione del contenuto | Trasferimento del contenuto all'app |
| Interfaccia | Opzionale (personalizzata) | SLComposeServiceViewController |
| Restituzione dati | Sì, tramite completeRequest | No |
| Contesto | Rimane nell'app host | Passa all'estensione |
| Posizione nel menu | Action Sheet (parte superiore) | Share Sheet (parte inferiore) |
| Azione tipica | Traduzione, correzione, filtro | Salvataggio, pubblicazione |
Action Extension appare nel menu delle azioni (Action Sheet) quando si tocca il pulsante “Condividi” o “...”. iOS posiziona automaticamente le Action Extensions nella parte superiore del foglio (azioni) e le Share Extensions nella parte inferiore (app). Scenario utente: ha selezionato del testo → ha toccato “Azioni” → ha scelto la tua Action Extension → ha ricevuto il risultato elaborato senza cambiare app.
Action Extension consiste in un target in Xcode, un UIViewController per visualizzare l'interfaccia (opzionale), NSExtensionContext per l'input/output dei dati e la configurazione Info.plist. L'architettura è più semplice di Share Extension: non c'è un'interfaccia di composizione obbligatoria e l'estensione può funzionare completamente senza UI.
Target — un bundle separato con un identificatore ereditato dall'app principale. UIViewController — interfaccia opzionale per mostrare avanzamento, impostazioni o risultati. NSExtensionContext — un contenitore con dati di input (inputItems) e il metodo completeRequest per restituire i risultati. Info.plist — configurazione di attivazione tramite NSExtensionActivationRule e attributi (NSExtensionAttributes) per specificare i tipi di contenuto supportati.
Action Extension riceve i dati di input tramite extensionContext?.inputItems — un array di NSExtensionItem. Ogni elemento contiene allegati con dati e UTI. Dopo l'elaborazione, l'estensione chiama completeRequest(returningItems:) con un array di NSExtensionItem di output. L'app host riceve i dati elaborati e li visualizza. Modello asincrono: l'estensione può eseguire operazioni lunghe, mantenendo il contesto fino a 30 secondi.
Vediamo come creare un'Action Extension in Swift per tradurre il testo selezionato. L'estensione riceve il testo dall'app host, lo invia a un server di traduzione e restituisce il risultato. ActionViewController è il controller di base creato da Xcode quando si aggiunge un target.
import UIKit
import MobileCoreServices
class ActionViewController: UIViewController {
@IBOutlet var resultLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
extractTextAndTranslate()
}
func extractTextAndTranslate() {
guard let item = extensionContext?.inputItems.first
as? NSExtensionItem
else { return }
for attachment in item.attachments ?? [] {
attachment.loadItem(
forTypeIdentifier: kUTTypePlainText as String
) { [weak self] (text, error) in
guard let inputText = text as? String else { return }
TranslationService().translate(inputText, from: "en", to: "ru") {
translated in
DispatchQueue.main.async {
self?.resultLabel?.text = translated
}
}
}
}
}
}
Dopo l'elaborazione, l'estensione restituisce il risultato all'app host. completeRequest con dati di output è uno scenario alternativo in cui l'estensione non mostra un'interfaccia utente ma restituisce immediatamente il contenuto elaborato.
// Returning processed text to host app
let resultItem = NSExtensionItem()
let resultData = translated.data(using: .utf8)!
let attachment = NSItemProvider(
item: resultData,
typeIdentifier: kUTTypePlainText as String
)
resultItem.attachments = [attachment]
extensionContext?.completeRequest(
returningItems: [resultItem], completionHandler: nil
)
Action Extension può funzionare in due modalità: con UI e senza UI. In modalità senza UI, l'estensione esegue l'azione completamente in background e chiama completeRequest subito dopo l'elaborazione. In modalità con UI, l'estensione mostra un controller, l'utente conferma l'azione e solo allora completeRequest invia il risultato. La selezione della modalità dipende dalla complessità dell'azione e dalla necessità di input dell'utente.
Il metodo loadItem(forTypeIdentifier:) funziona in modo asincrono — i dati possono essere grandi (immagini, video). NSItemProvider gestisce lo streaming e la memorizzazione nella cache. Per le immagini usa kUTTypeImage, per i file usa kUTTypeFileURL. Importante: loadItem può essere chiamato su un thread in background — aggiorna l'interfaccia utente solo tramite DispatchQueue.main.
Action Extension restituisce i dati elaborati tramite completeRequest con un array di NSExtensionItem. Ogni elemento corrisponde al tipo di dati di output. L'app host può sostituire il contenuto originale con quello elaborato — ad esempio, sostituire l'immagine originale con una filtrata. NSExtensionItem supporta le stesse UTI dell'input, più UTI aggiuntive (ad esempio, public.html per contenuti web).
Action Extension viene utilizzata in dozzine di scenari — dalle semplici utilità ai flussi di lavoro aziendali complessi. Gli esempi classici coprono operazioni di testo, grafica e file, nonché l'integrazione di contenuti web.
Action Extension per il testo: traduzione, controllo ortografico, conteggio caratteri, cambio maiuscole/minuscole, crittografia, generazione di codice QR dal testo. L'utente seleziona il testo in qualsiasi app con campo di testo (Safari, Note, Mail) ed esegue l'azione con un tocco. L'evidenziazione della sintassi del codice, la formattazione Markdown e l'accorciamento degli URL sono esempi popolari di Action Extension per utenti avanzati.
Per le immagini, Action Extension offre: applicazione filtri, ritaglio, ridimensionamento, conversione formati (HEIC in JPEG), aggiunta filigrana, riconoscimento testo (OCR) e compressione. L'elaborazione delle immagini deve essere rapida — l'utente si aspetta un risultato entro 2–3 secondi. Per operazioni pesanti, usa Core Image sulla GPU o code in background.
Action Extension per URL: creare PDF da una pagina web, salvare in Pocket/Pinterest, controllare la velocità del sito, archiviare una pagina, ottenere metadati Open Graph, generare screenshot della pagina. La generazione di PDF è uno degli scenari più richiesti: l'utente converte una pagina web in PDF senza aprire servizi di terze parti.
Domande frequenti
Share Extension invia contenuti dall'app host alla tua app. Action Extension elabora i contenuti sul posto e restituisce il risultato. Share — trasferimento, Action — trasformazione. Questa differenza fondamentale determina l'architettura e l'UX.
Sì. Se l'azione non richiede input dall'utente (ad esempio, conteggio caratteri), l'estensione può eseguirla in background e restituire immediatamente il risultato tramite completeRequest. In Info.plist è necessario specificare NSExtensionActivationSupportsWebURL o un'altra UTI corrispondente al tipo di dati.
In qualsiasi app che supporti UIActivityViewController o controller di azione standard. Questi includono Safari, Foto, File, Note, Mail e migliaia di app di terze parti. Action Extension non funziona nelle app che non utilizzano i meccanismi di azione standard di iOS.
Tramite extensionContext.completeRequest(returningItems:) con un array di NSExtensionItem. Ogni elemento di output contiene un NSItemProvider con i dati elaborati. L'app host riceve il risultato nel delegato di UIActivityViewController o un callback simile.
L'estensione funziona fino a 30 secondi, dopo di che iOS la termina forzatamente. Non c'è accesso diretto all'app principale — solo tramite App Groups. Action Extension non può eseguire attività in background dopo il completamento. Per operazioni lunghe, utilizza NSURLSession in background con una notifica al prossimo avvio.
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