Siri Intent es un mecanismo para integrar una aplicación iOS con el asistente de voz Siri, permitiendo a los usuarios realizar acciones por voz sin abrir la aplicación. El desarrollo se realiza en Swift utilizando los frameworks Intents (Intents.framework) y SiriKit. A partir de iOS 16 apareció App Intents — un nuevo framework más flexible para crear comandos de voz personalizados. Siri Intent admite 10 dominios (mensajes, llamadas, pagos, notas, entrenamientos y otros) y permite a la aplicación procesar solicitudes de voz a través de IntentHandler. Exploremos conceptos clave, arquitectura y ejemplos de código.
Puntos clave
Siri Intent es un mecanismo que permite a una aplicación iOS procesar comandos de voz pronunciados por el usuario a través de Siri. Cuando el usuario dice “Siri, send a message to Ivan on Telegram,” Siri reconoce el intent (INSendMessageIntent), identifica la aplicación que puede manejarlo (Telegram), pasa los parámetros (contact “Ivan,” message text), y lanza el IntentHandler de la aplicación. Todo el proceso toma 0.5–2 seconds y no requiere abrir la aplicación.
La arquitectura de Siri Intent incluye tres componentes. El primero es el archivo .intentdefinition, que describe la estructura del intent: parámetros (String, Integer, INPerson), frases de activación y respuestas. El segundo es IntentHandler, que implementa el protocolo de manejo: recibe parámetros, realiza la acción (por ejemplo, envía un mensaje a través de la API de la aplicación) y devuelve un INInteraction con un código de resultado. El tercero es Intents Extension, un target separado en Xcode que se ejecuta en su propio proceso. Siri lanza la Intents Extension ante una solicitud de voz, le pasa datos y recibe el resultado. La Extension no tiene UI — se ejecuta en segundo plano y debe completarse en 5–10 segundos.
Casos de uso de Siri Intent: sending messages (INSendMessageIntent), making calls (INStartCallIntent), sending payments (INSendPaymentIntent), creating notes (INCreateNoteIntent), workouts (INStartWorkoutIntent), photos (INBúsquedaForFotosIntent), booking trips (INBookRestaurantReservationIntent), car functions (INSetCarLockStatusIntent). Cada dominio tiene un esquema de parámetros estricto y limitaciones definidas por Apple para la seguridad.
SiriKit es un framework presentado por Apple en iOS 10 (2016). Proporciona dominios (Intents) prefabricados para acciones típicas: messages, calls, payments, notes, reminders, photos, workouts, booking, car functions, search. Para cada dominio, Apple definió un conjunto de clases Intent (INSendMessageIntent, INStartCallIntent) que la aplicación implementa a través de IntentHandler. SiriKit genera automáticamente una confirmación de UI antes de la ejecución (para pagos y mensajes, la confirmación es obligatoria).
Dominios de SiriKit:
Limitaciones de SiriKit: los desarrolladores no pueden crear dominios personalizados — solo pueden usar los predefinidos. Esta limitación se resolvió en iOS 16 con la introducción de App Intents, que permite crear comandos de voz arbitrarios para cualquier acción de la aplicación.
App Intents es un framework de Apple presentado en iOS 16 (2022) y significativamente ampliado en iOS 17–18. A diferencia de SiriKit con sus dominios fijos, App Intents permite a los desarrolladores definir sus propios comandos de voz para cualquier acción de la aplicación: “Siri, add milk to the shopping list in AnyList,” “Siri, schedule a meeting in Fantastical,” “Siri, turn on the living room light in Home.” Los intents personalizados se definen a través del protocolo AppIntent con parámetros, frases y un esquema de confirmación.
Componentes de App Intents:
App Intents vs SiriKit: la principal diferencia es la flexibilidad. SiriKit está limitado a 10 dominios, App Intents permite crear cualquier comando. SiriKit requiere un target separado de Intents Extension, App Intents funciona dentro de la aplicación principal. SiriKit usa Intents.framework (Objective-C/Swift), App Intents usa una nueva sintaxis declarativa de Swift con macros @Intent y @Parameter. Según Apple, App Intents se utiliza en el 70% de los nuevos proyectos con soporte de Siri en 2025.
Un ejemplo de creación de un App Intent personalizado para añadir una nota a la aplicación. Demuestra el enfoque moderno utilizando el framework App Intents en iOS 16+.
import AppIntents
// 1. Intent personalizado para añadir una nota
struct AddNoteIntent: AppIntent {
// Nombre del comando (visible en Shortcuts)
static var title: LocalizedStringResource = "Añadir nota"
// Descripción del comando
static var description: LocalizedStringResource = "Crea una nueva nota en la aplicación"
// Parámetros del comando
@Parameter(title: "Texto de la nota")
var noteContent: String
@Parameter(title: "Categoría", default: "General")
var category: String
// Ejecutando la acción
func perform() async throws -> some IntentResult {
// Crear una nota a través del almacenamiento local
let note = Note(content: noteContent, category: category)
try await NoteStore.shared.save(note)
// Devolver el resultado con un diálogo para Siri
return .result(
dialog: .response("Nota "(noteContent)" creada")
)
}
}
// 2. App Shortcut Provider — registro de comandos
struct NotesShortcuts: AppShortcutsProvider {
@AppShortcutsBuilder
static var appShortcuts: [AppShortcut] {
AppShortcut(
intent: AddNoteIntent(),
phrases: [
"Añadir nota a (.applicationName)",
"Crear una nota con (.$noteContent) en (.applicationName)",
"Escribe (.$noteContent) en (.applicationName)",
]
)
}
}
// 3. Intent SiriKit para mensajes (enfoque clásico)
class MessageIntentHandler: NSObject, INSendMessageIntentHandling {
func resolveRecipients(
for intent: INSendMessageIntent,
completion: @escaping ([INPersonResolutionResult]) -> Void
) {
guard let recipients = intent.recipients else {
completion([.needsRequired()])
return
}
// Resolver contactos a través de la libreta de direcciones de la aplicación
let results = recipients.map { INPersonResolutionResult.success(with: $0) }
completion(results)
}
func handle(
intent: INSendMessageIntent,
completion: @escaping (INSendMessageIntentResponse) -> Void
) {
// Enviar un mensaje a través de la API de la aplicación
let response = INSendMessageIntentResponse(
code: .success, userActivity: nil
)
completion(response)
}
}
Puntos clave: AppIntent — protocolo para comandos de voz personalizados; @Parameter — macro que define los parámetros del comando; perform() — método que ejecuta la acción y devuelve un resultado con un diálogo para Siri; AppShortcutsProvider — registra los comandos de la aplicación en Siri y Shortcuts; INSendMessageIntentHandling — protocolo SiriKit para manejar el dominio de mensajes. Las frases de activación se establecen mediante .applicationName y \.$parameter para variabilidad.
Recomendaciones para crear Siri Intents: defina frases de activación claras con variantes de pronunciación; devuelva un diálogo informativo después de la ejecución (éxito/error); maneje casos de parámetros incompletos mediante métodos resolve con solicitudes de aclaración; guarde INInteraction después de la ejecución para el aprendizaje de Siri; pruebe en un dispositivo real (el simulador no soporta Siri). Para App Intents, use @Intent con inAppBúsquedaKeywords para mejorar el reconocimiento.
Limitaciones: los Intents de SiriKit están limitados a 10 dominios. Intents Extension se ejecuta con un límite de 5–10 segundos — si se supera, Siri reporta un error. Siri Intent no tiene UI — toda la interfaz es generada por Siri. App Intents solo está disponible en iOS 16+ (~85% de cobertura de dispositivos en 2026). Para soportar iOS 13–15, se debe usar SiriKit. Privacidad: Siri no transmite grabaciones de audio a la aplicación — solo el texto de parámetros reconocido. Para acciones sensibles (pagos, mensajes), la confirmación del usuario es obligatoria.
| Parameter | SiriKit | App Intents |
|---|---|---|
| Minimum iOS | iOS 10 | iOS 16 |
| Domains | 10 predefined | Arbitrary |
| Language | Objective-C / Swift | Swift (macros) |
| Target | Intents Extension | Main app |
| UI | Siri UI (generation) | Siri UI (generation) |
| Confirmation | For payments/messages | Optional |
| Shortcuts | Manual | Automatic |
| Widget integration | No | WidgetIntent (iOS 17+) |
Rendimiento y depuración: Intents Extension se ejecuta en un proceso separado con un límite de memoria de 30–50 MB. Para depuración, use el esquema «Intents Extension» en Xcode adjunto al proceso de Siri. Los registros se muestran en la consola del dispositivo. App Intents se depura a través de la aplicación Shortcuts en el dispositivo. INInteraction se guarda localmente y Siri lo usa para sugerencias — elimine interacciones obsoletas mediante INInteraction delete.
Preguntas frecuentes
Siri Intent es un comando de voz que activa una acción específica en una aplicación sin abrirla. El usuario dice «Siri, envía un mensaje en WhatsApp» y Siri realiza la acción a través del IntentHandler of the WhatsApp app.
SiriKit (iOS 10+) es un framework más antiguo con dominios predefinidos (mensajes, llamadas, pagos). App Intents (iOS 16+) is a new framework that allows creating custom intents for any actions without domain limitations.
SiriKit soporta 10 dominios: messages (INSendMessageIntent), calls (INStartCallIntent), payments (INSendPaymentIntent), notes, reminders, photos, workouts, trip booking, car functions, and search.
Siri reconoce el habla y lo empareja con un Intent específico basado en frases definidas en .intentdefinition. IntentHandler realiza la acción y devuelve el resultado. Todo el proceso toma 0.5–2 seconds.
Sí, después de reconocer el intent pero antes de ejecutarlo, Siri muestra una confirmación al usuario. El usuario puede cancelar la ejecución por voz («Cancelarar») o táctil. Para pagos y mensajes, la confirmación es obligatoria.
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