AppIntent è un framework Apple presentato in iOS 16 come sostituto del vecchio Intents framework, che fornisce un'API dichiarativa per integrare le app con Siri, Shortcuts e Spotlight. A differenza dell'approccio precedente, che richiedeva un file Intent Definition File separato e la generazione di codice ObjC, AppIntent utilizza Swift puro con i protocolli AppIntent e AppEnum. Secondo la documentazione Apple Developer, 2026, AppIntent riduce la quantità di codice per creare un intent in media del 60% rispetto a Intents framework, e il tempo di integrazione dei comandi Siri scende da diversi giorni a poche ore.
Punti chiave
AppIntent è un framework Apple per descrivere in modo dichiarativo comandi che la tua app può eseguire su richiesta di Siri, Shortcuts, Spotlight, Control Center e Action Button. Si basa sul protocollo AppIntent, in cui lo sviluppatore descrive il nome dell'intent, i suoi parametri e il metodo perform() — la logica eseguibile. Il framework genera automaticamente un'interfaccia utente per configurare i parametri nell'app Shortcuts e frasi vocali per Siri.
Prima di AppIntent, gli sviluppatori usavano Intents framework — un sistema basato sul file Intents Definition File che generava codice Objective-C e richiedeva la configurazione di un'estensione Intents Extension separata. Questo processo era macchinoso: anche un intent semplice richiedeva fino a 5 file di configurazione. AppIntent elimina questa complessità — un intent è descritto in un singolo file Swift e il sistema genera automaticamente tutto il necessario per l'integrazione con Siri e Shortcuts.
Secondo la sessione WWDC 2024 "Dive deeper into App Intents", Apple vede AppIntent come il meccanismo centrale per estendere le funzionalità delle app oltre l'interfaccia utente tradizionale. Al momento del rilascio di iOS 18, oltre il 70% delle app nella top 100 dell'App Store utilizza già AppIntent per l'integrazione con Shortcuts e Siri, e l'utente medio di iOS 18 avvia 4–6 intent al giorno tramite comandi vocali o widget.
Intents framework (iOS 10–15) richiedeva la creazione di un file .intentdefinition, la generazione di classi ObjC/Swift tramite Xcode, la configurazione di Intents Extension e App Intent Configuration. AppIntent (iOS 16+) sostituisce completamente questa pipeline con codice Swift puro senza generazione, estensioni o configurazioni aggiuntive. Ciò rende il processo di creazione degli intent accessibile allo sviluppatore iOS medio senza studiare SiriKit.
Il vantaggio principale di AppIntent è la dichiaratività. Lo sviluppatore descrive cosa fa l'intent, non come si integra con il sistema. Il framework stesso gestisce gli scenari di dialogo di Siri, la visualizzazione dei parametri in Shortcuts e il passaggio di contesto tra intent. Nel vecchio Intents framework, ogni aspetto dell'integrazione doveva essere codificato manualmente, incluso INUIHostedView per visualizzare l'interfaccia utente dell'intent.
| Caratteristica | Intents framework | AppIntent |
|---|---|---|
| Volume di codice | 100–300 righe per intent | 30–60 righe |
| File necessari | .intentdefinition, Extension, Config | 1 file Swift |
| Generazione codice | Obbligatoria (Xcode -> ObjC) | Non richiesta |
| Asincronicità | Solo completion handler | async/await + progresso |
| IntentDialog | No | Dialoghi Siri integrati |
AppIntent è il protocollo centrale che definisce un intent. Contiene un title (nome per Siri), description (descrizione in Shortcuts), parametri (tramite @Parameter) e il metodo perform() che restituisce IntentResult. Il risultato può essere IntentDialog (dialogo con Siri), un valore da restituire a Shortcuts o un errore. Ogni intent può anche fornire suggestedInvocationPhrase — una frase per l'invocazione vocale.
AppEntity descrive le entità con cui lavorano gli intent. Ad esempio, se un'app gestisce progetti, AppEntity Project contiene id, displayRepresentation (come visualizzare l'entità nell'interfaccia utente) e defaultQuery (come cercare entità). AppEnum è un'enumerazione per parametri di selezione che genera automaticamente un'interfaccia utente con un elemento picker in Shortcuts. Invece di creare manualmente un elenco di parametri, basta dichiarare un enum conforme ad AppEnum.
enum TaskPriority: String, AppEnum {
case low, medium, high
static var typeDisplayRepresentation: TypeDisplayRepresentation =
"Priority"
var displayRepresentation: DisplayRepresentation {
switch self {
case .low: "Low"
case .medium: "Medium"
case .high: "High"
}
}
}
struct CreateTaskIntent: AppIntent {
static var title: LocalizedStringResource = "Create Task"
@Parameter(title: "Task Name")
var taskName: String
@Parameter(title: "Priority")
var priority: TaskPriority
func perform() async throws -> some IntentResult {
try await TaskManager.shared
.createTask(name: taskName, priority: priority)
return .result(dialog: "Task created")
}
}
I parametri di AppIntent vengono dichiarati tramite il property wrapper @Parameter, che si integra automaticamente con l'interfaccia utente di Shortcuts e le richieste vocali di Siri. Ogni parametro ha un title (visualizzato in Shortcuts) e può includere una descrizione, valori predefiniti e vincoli. AppIntent supporta i tipi standard: String, Int, Double, Bool, oltre a tipi personalizzati tramite AppEntity e AppEnum.
La validazione dei parametri viene eseguita nel metodo perform() prima di eseguire la logica. Se i parametri non sono validi, l'intent restituisce un errore tramite IntentError. Per validazioni complesse, è possibile implementare il metodo validate(), chiamato prima di perform(), che può fornire feedback all'utente tramite IntentDialog ancora prima di eseguire il comando. Ciò è particolarmente utile per scenari vocali di Siri, dove è più semplice chiedere nuovamente all'utente piuttosto che eseguire un comando errato.
struct SendMessageIntent: AppIntent {
static var title: LocalizedStringResource = "Send Message"
@Parameter(title: "Recipient")
var recipient: String
@Parameter(title: "Message")
var message: String
func validate() throws {
guard message.count >= 1 else {
throw IntentError.invalidMessage
}
}
func perform() async throws -> some IntentResult {
try await Messenger.shared
.send(recipient: recipient, text: message)
return .result(dialog: "Sent!")
}
}
Un esempio completo di intent per cercare note in un'app dimostra il lavoro con AppEntity e EntityQuery. SearchNotesIntent accetta una stringa di ricerca e restituisce un elenco di note trovate. AppEntity Note descrive la struttura della nota e EntityQuery implementa la ricerca nell'archivio. Il risultato viene restituito tramite IntentResult con un array di entità, che Shortcuts mostra all'utente.
struct Note: AppEntity {
let id: UUID
let title: String
let content: String
static var typeDisplayRepresentation: TypeDisplayRepresentation =
"Note"
var displayRepresentation: DisplayRepresentation {
DisplayRepresentation(title: "(title)")
}
}
struct SearchNotesIntent: AppIntent {
static var title: LocalizedStringResource = "Search Notes"
@Parameter(title: "Query")
var query: String
func perform() async throws -> some IntentResult {
let results = await NoteStore.shared
.search(query)
.map { $0.toEntity() }
return .result(value: results)
}
}
Dopo aver dichiarato un AppIntent, l'integrazione con Shortcuts e Siri avviene automaticamente. L'app Shortcuts scansiona tutti gli AppIntents dalle app installate e li mostra nell'elenco delle azioni disponibili. L'utente può aggiungere un intent al suo collegamento, configurarne i parametri e combinarlo con altre azioni. Per Siri, gli intent appaiono come comandi vocali senza configurazione aggiuntiva da parte dello sviluppatore.
Lo sviluppatore può migliorare l'integrazione aggiungendo suggestedInvocationPhrase — una frase consigliata per l'invocazione vocale. Ad esempio, per un intent di aggiunta attività: suggestedInvocationPhrase = "Add new task". Siri analizza questa frase e la suggerisce all'utente durante l'apprendimento dei comandi vocali. È anche possibile specificare categories — la categoria dell'intent (create, view, search, edit), che aiuta Shortcuts a raggruppare le azioni per significato.
| Categoria | Esempio | Comportamento in Shortcuts |
|---|---|---|
| .create | CreateTaskIntent | Si raggruppa con altre azioni di creazione |
| .view | ViewWeatherIntent | Visualizzato nella categoria "Visualizza" |
| .search | SearchNotesIntent | Marcato come azione di ricerca |
| .edit | UpdateTaskIntent | Si raggruppa con azioni di modifica |
Domande frequenti
No. AppIntent non richiede un'estensione Intents Extension separata. Gli intent vengono compilati direttamente nell'applicazione principale, semplificando l'architettura ed eliminando la necessità di comunicazione tra processi.
AppIntent è disponibile su iOS 16+, iPadOS 16+, macOS 13+, watchOS 9+. Per iOS 15 e versioni precedenti, è necessario utilizzare Intents framework. Si consiglia di supportare entrambe le API per un'ampia copertura di dispositivi.
IntentsResult supporta String, Int, Double, Bool, array di AppEntity, IntentDialog e tipi personalizzati. Le strutture dati complesse vengono restituite tramite EntityQuery, che si integra automaticamente con l'interfaccia utente di Shortcuts.
Sì, tramite AppIntentsPackage — un pacchetto che consente di eseguire intent lato server. Utile per app con logica server dove gli intent devono accedere a dati non disponibili localmente.
Utilizza il simulatore iOS 16+ con l'app Shortcuts. Aggiungi l'intent a un comando Shortcuts nel simulatore ed eseguilo. Gli scenari Siri richiedono un dispositivo fisico poiché il simulatore non supporta l'input vocale.
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