AppIntent es un framework de Apple presentado en iOS 16 como reemplazo del obsoleto Intents framework, que proporciona una API declarativa para integrar aplicaciones con Siri, Shortcuts y Spotlight. A diferencia del enfoque anterior, que requería un archivo Intent Definition File separado y la generación de código ObjC, AppIntent usa Swift puro con los protocolos AppIntent y AppEnum. Según la Documentación de Apple Developer, 2026, AppIntent reduce la cantidad de código para crear un intent en un promedio del 60% en comparación con Intents framework, y el tiempo de integración de comandos de Siri disminuye de varios días a varias horas.
Puntos clave
AppIntent es un framework de Apple para describir de forma declarativa comandos que tu aplicación puede ejecutar a petición de Siri, Shortcuts, Spotlight, Control Center y Action Button. Se basa en el protocolo AppIntent, donde el desarrollador describe el nombre del intent, sus parámetros y el método perform() — la lógica ejecutable. El framework genera automáticamente una interfaz de usuario para configurar parámetros en la aplicación Shortcuts y frases de voz para Siri.
Antes de AppIntent, los desarrolladores usaban Intents framework, un sistema basado en el archivo Intents Definition File que generaba código Objective-C y requería configurar una extensión Intents Extension separada. Este proceso era engorroso: incluso un intent simple requería hasta 5 archivos de configuración. AppIntent elimina esta complejidad — un intent se describe en un solo archivo Swift, y el sistema genera automáticamente todo lo necesario para la integración con Siri y Shortcuts.
Según la sesión de la WWDC 2024 "Dive deeper into App Intents", Apple considera AppIntent como el mecanismo central para extender la funcionalidad de las aplicaciones más allá de la interfaz de usuario tradicional. Para cuando se lanzó iOS 18, más del 70% de las aplicaciones del top 100 de App Store ya usaban AppIntent para la integración con Shortcuts y Siri, y el usuario medio de iOS 18 ejecuta de 4 a 6 intents al día mediante comandos de voz o widgets.
Intents framework (iOS 10–15) requería crear un archivo .intentdefinition, generar clases ObjC/Swift mediante Xcode, configurar Intents Extension y App Intent Configuration. AppIntent (iOS 16+) reemplaza completamente este proceso con código Swift puro sin generación, extensiones ni configuraciones adicionales. Esto hace que el proceso de creación de intents sea accesible para el desarrollador iOS promedio sin necesidad de estudiar SiriKit.
La ventaja clave de AppIntent es la declaratividad. El desarrollador describe qué hace el intent, no cómo se integra con el sistema. El framework mismo maneja los escenarios de diálogo de Siri, la visualización de parámetros en Shortcuts y la transferencia de contexto entre intents. En el antiguo Intents framework, cada aspecto de la integración debía codificarse manualmente, incluido INUIHostedView para mostrar la interfaz de usuario del intent.
| Característica | Intents framework | AppIntent |
|---|---|---|
| Volumen de código | 100–300 líneas por intent | 30–60 líneas |
| Archivos necesarios | .intentdefinition, Extension, Config | 1 archivo Swift |
| Generación de código | Obligatoria (Xcode -> ObjC) | No requerida |
| Asincronía | Solo completion handler | async/await + progreso |
| IntentDialog | No | Diálogos integrados de Siri |
AppIntent es el protocolo central que define un intent. Contiene un title (nombre para Siri), description (descripción en Shortcuts), parámetros (mediante @Parameter) y el método perform() que devuelve IntentResult. El resultado puede ser IntentDialog (diálogo con Siri), un valor para devolver a Shortcuts o un error. Cada intent también puede proporcionar suggestedInvocationPhrase — una frase para la invocación por voz.
AppEntity describe entidades con las que trabajan los intents. Por ejemplo, si una aplicación gestiona proyectos, AppEntity Project contiene id, displayRepresentation (cómo mostrar la entidad en la interfaz de usuario) y defaultQuery (cómo buscar entidades). AppEnum es una enumeración para parámetros de selección que genera automáticamente una interfaz de usuario con un elemento picker en Shortcuts. En lugar de crear manualmente una lista de parámetros, basta con declarar un enum conforme a 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")
}
}
Los parámetros de AppIntent se declaran mediante el property wrapper @Parameter, que se integra automáticamente con la interfaz de usuario de Shortcuts y las solicitudes de voz de Siri. Cada parámetro tiene un title (se muestra en Shortcuts) y puede incluir una descripción, valores predeterminados y restricciones. AppIntent admite tipos estándar: String, Int, Double, Bool, así como tipos personalizados mediante AppEntity y AppEnum.
La validación de parámetros se realiza en el método perform() antes de ejecutar la lógica. Si los parámetros no son válidos, el intent devuelve un error mediante IntentError. Para validaciones complejas, se puede implementar el método validate(), que se llama antes de perform() y puede proporcionar retroalimentación al usuario a través de IntentDialog incluso antes de ejecutar el comando. Esto es especialmente útil para escenarios de voz de Siri, donde es más fácil volver a preguntar al usuario que ejecutar un comando incorrecto.
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 ejemplo completo de un intent para buscar notas en una aplicación demuestra el trabajo con AppEntity y EntityQuery. SearchNotesIntent recibe una cadena de búsqueda y devuelve una lista de notas encontradas. AppEntity Note describe la estructura de la nota, y EntityQuery implementa la búsqueda en el almacenamiento. El resultado se devuelve mediante IntentResult con un array de entidades, que Shortcuts muestra al usuario.
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)
}
}
Después de declarar un AppIntent, la integración con Shortcuts y Siri ocurre automáticamente. La aplicación Shortcuts escanea todos los AppIntents de las aplicaciones instaladas y los muestra en la lista de acciones disponibles. El usuario puede añadir un intent a su atajo, configurar sus parámetros y combinarlo con otras acciones. Para Siri, los intents aparecen como comandos de voz sin configuración adicional por parte del desarrollador.
El desarrollador puede mejorar la integración añadiendo suggestedInvocationPhrase — una frase recomendada para la invocación por voz. Por ejemplo, para un intent de añadir tarea: suggestedInvocationPhrase = "Add new task". Siri analiza esta frase y la sugiere al usuario al aprender comandos de voz. También se puede especificar categories — la categoría del intent (create, view, search, edit), que ayuda a Shortcuts a agrupar acciones por significado.
| Categoría | Ejemplo | Comportamiento en Shortcuts |
|---|---|---|
| .create | CreateTaskIntent | Se agrupa con otras acciones de creación |
| .view | ViewWeatherIntent | Se muestra en la categoría "Ver" |
| .search | SearchNotesIntent | Se marca como acción de búsqueda |
| .edit | UpdateTaskIntent | Se agrupa con acciones de edición |
Preguntas frecuentes
No. AppIntent no requiere una extensión Intents Extension separada. Los intents se compilan directamente en la aplicación principal, lo que simplifica la arquitectura y elimina la necesidad de comunicación entre procesos.
AppIntent está disponible en iOS 16+, iPadOS 16+, macOS 13+, watchOS 9+. Para iOS 15 y anteriores, es necesario usar Intents framework. Se recomienda admitir ambas API para una amplia cobertura de dispositivos.
IntentsResult admite String, Int, Double, Bool, arrays de AppEntity, IntentDialog y tipos personalizados. Las estructuras de datos complejas se devuelven mediante EntityQuery, que se integra automáticamente con la interfaz de usuario de Shortcuts.
Sí, mediante AppIntentsPackage — un paquete que permite ejecutar intents en el lado del servidor. Esto es útil para aplicaciones con lógica de servidor donde los intents necesitan acceder a datos que no están disponibles localmente.
Usa el simulador de iOS 16+ con la aplicación Shortcuts. Añade el intent a un comando de Shortcuts en el simulador y ejecútalo. Los escenarios de Siri requieren un dispositivo físico, ya que el simulador no admite entrada de voz.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también