Actualizaciones de SiriKit en iOS 11
SiriKit se introdujo en iOS 10, con una serie de dominios de servicio (incluidos los entrenamientos, la reserva de viajes y la realización de llamadas). Consulte la sección SiriKit para los conceptos de SiriKit y cómo implementar SiriKit en la aplicación.
SiriKit en iOS 11 agrega estos dominios de intención nuevos y actualizados:
- Listas y notas: ¡novedades! Proporciona una API para que las aplicaciones procesen tareas y notas.
- Códigos visuales: ¡novedades! Siri puede mostrar códigos QR para compartir información de contacto o participar en transacciones de pago.
- Pagos: se han agregado intenciones de búsqueda y transferencia para interacciones de pago.
- Reserva de viajes: se han agregado intenciones de cancelación y comentarios.
Entre las otras características nuevas se incluyen estas:
- Nombres de aplicación alternativos: proporciona alias que ayudan a los clientes a que Siri tenga como destino la aplicación ofreciendo nombres o pronunciaciones alternativos.
- Inicio de entrenamiento: proporciona la capacidad de iniciar un entrenamiento en segundo plano.
A continuación se explican algunas de estas características. Para obtener más información sobre las demás, consulte documentación de SiriKit de Apple.
Listas y notas
El nuevo dominio de listas y notas proporciona una API para que las aplicaciones procesen tareas y notas a través de solicitudes de voz de Siri.
Tareas
- Tener un título y un estado de finalización.
- Opcionalmente, incluya una fecha límite y una ubicación.
Notas
- Tener un título y un campo de contenido.
Tanto las tareas como las notas se pueden organizar en grupos.
Procedimiento para procesar una solicitud de SiriKit
Siga estos pasos para procesar una solicitud de SiriKit:
- Resolver: valide los parámetros y solicite más información del usuario (si es necesario).
- Confirmar: validación final y comprobación de que se puede procesar la solicitud.
- Identificador: realice la operación (actualizar datos o realizar operaciones de red).
Los dos primeros pasos son opcionales (aunque se recomienda) y se requiere el paso final. Hay instrucciones más detalladas en la sección SiriKit.
Resolver y confirmar métodos
Estos métodos opcionales permiten que el código realice la validación, seleccione los valores predeterminados o solicite información adicional del usuario.
Por ejemplo, para la interfaz IINCreateTaskListIntent
, el método necesario es HandleCreateTaskList
. Hay cuatro métodos opcionales que proporcionan más control sobre la interacción de Siri:
ResolveTitle
: valida el título, establece un título predeterminado (si procede) o indica que los datos no son necesarios.ResolveTaskTitles
: valida la lista de tareas habladas por el usuario.ResolveGroupName
: valida el nombre del grupo, elige un grupo predeterminado o indica que los datos no son necesarios.ConfirmCreateTaskList
: valida que el código puede realizar la operación solicitada, pero no la realiza (solo los métodosHandle*
deben modificar los datos).
Controlar la intención
Hay seis intenciones en el dominio de listas y notas, tres para tareas y tres para notas. Los métodos que debe implementar para controlar estas intenciones son:
- Para tareas:
HandleAddTasks
HandleCreateTaskList
HandleSetTaskAttribute
- Para obtener notas:
HandleCreateNote
HandleAppendToNote
HandleSearchForNotebookItems
Cada método tiene un tipo de intención específico pasado, que contiene toda la información que Siri ha analizado de la solicitud del usuario (y posiblemente se ha actualizado en los métodos Resolve*
y Confirm*
).
La aplicación debe analizar los datos proporcionados y, a continuación, realizar algunas acciones para almacenar o procesar los datos, y devolver un resultado que Siri habla y muestra al usuario.
Códigos de respuesta
Los métodos Handle*
obligatorios y opcionales Confirm*
indican un código de respuesta estableciendo un valor en el objeto que pasan al controlador de finalización. Las respuestas proceden de la enumeración INCreateTaskListIntentResponseCode
:
Ready
: vuelve durante la fase de confirmación (es decir, desde un métodoConfirm*
, pero no desde un métodoHandle*
).InProgress
: se usa para tareas de larga duración (como una operación de red o servidor).Success
: responde con los detalles de la operación correcta (solo desde un métodoHandle*
).Failure
: significa que se produjo un error y que no se pudo completar la operación.RequiringAppLaunch
: no se puede procesar mediante la intención, pero la operación es posible en la aplicación.Unspecified
: no usar: se mostrará el mensaje de error al usuario.
Obtenga más información sobre estos métodos y respuestas en la documentación de notas y listas de SiriKit de Apple.
Implementar listas y notas
En primer lugar, para agregar compatibilidad con SiriKit, siga estos pasos para la aplicación de iOS:
- Marque SiriKit en Entitlements.plist.
- Agregue la clave Privacy – Siri Usage Description (Privacidad: descripción de uso de Siri) a Info.plist, junto con un mensaje para sus clientes.
- Llame al método
INPreferences.RequestSiriAuthorization
en la aplicación para pedir al usuario que permita interacciones de Siri. - Agregue SiriKit al identificador de aplicación en el Portal para desarrolladores y vuelva a crear los perfiles de aprovisionamiento para incluir el nuevo derecho.
A continuación, agregue un nuevo proyecto de extensión a la aplicación para controlar las solicitudes de Siri:
- Haga clic con el botón derecho en la solución y elija Agregar > Agregar nuevo proyecto....
- Elija la iOS > Extensión > Extensión de intenciones.
- Se agregarán dos nuevos proyectos: Intent e IntentUI. Personalizar la interfaz de usuario es opcional, por lo que el ejemplo solo incluye código en el proyecto de Intención.
El proyecto de extensión es donde se procesarán todas las solicitudes de SiriKit. Como extensión independiente, no tiene ninguna manera de comunicarse automáticamente con la aplicación principal: normalmente se resuelve mediante la implementación de almacenamiento de archivos compartidos mediante grupos de aplicaciones.
Configuración de IntentHandler
La clase IntentHandler
es el punto de entrada para las solicitudes de Siri, cada intención se pasa al método GetHandler
, que devuelve un objeto que puede controlar la solicitud.
El código siguiente muestra una implementación sencilla:
[Register("IntentHandler")]
public partial class IntentHandler : INExtension, IINNotebookDomainHandling
{
protected IntentHandler(IntPtr handle) : base(handle)
{}
public override NSObject GetHandler(INIntent intent)
{
// This is the default implementation. If you want different objects to handle different intents,
// you can override this and return the handler you want for that particular intent.
return this;
}
// add intent handlers here!
}
La clase debe heredar de INExtension
y, dado que el ejemplo va a controlar las listas y las intenciones de notas, también implementa IINNotebookDomainHandling
.
Nota:
- Hay una convención en .NET para que las interfaces estén prefijos con una
I
mayúscula, que Xamarin se adhiere al enlazar protocolos desde el SDK de iOS. - Xamarin también conserva los nombres de tipo de iOS y Apple usa los dos primeros caracteres en los nombres de tipo para reflejar el marco al que pertenece un tipo.
- Para el marco de
Intents
, los tipos tienen el prefijoIN*
(por ejemplo,INExtension
), pero estos son interfaces no . - También sigue que los protocolos (que se convierten en interfaces en C#) terminan con dos
I
, comoIINAddTasksIntentHandling
.
Control de intenciones
Cada intención (Agregar tarea, Establecer atributo de tarea, etc.) se implementa en un único método similar al que se muestra a continuación. El método debe realizar tres funciones principales:
- Procesar la intención: los datos analizados por Siri están disponibles en un objeto
intent
específico del tipo de intención. Es posible que la aplicación haya validado que los datos usan métodos opcionalesResolve*
. - Validar y actualizar el almacén de datos: guarde los datos en el sistema de archivos (mediante grupos de aplicaciones para que la aplicación principal de iOS también pueda acceder a ellos) o a través de una solicitud de red.
- Proporcionar respuesta: use el controlador
completion
para devolver una respuesta a Siri para leer o mostrar al usuario:
public void HandleCreateTaskList(INCreateTaskListIntent intent, Action<INCreateTaskListIntentResponse> completion)
{
var list = TaskList.FromIntent(intent);
// TODO: have to create the list and tasks... in your app data store
var response = new INCreateTaskListIntentResponse(INCreateTaskListIntentResponseCode.Success, null)
{
CreatedTaskList = list
};
completion(response);
}
Observe que null
se pasa como segundo parámetro a la respuesta: este es el parámetro de actividad del usuario y, cuando no se proporciona, se usará un valor predeterminado.
Puede establecer un tipo de actividad personalizado siempre que la aplicación de iOS la admita a través de la clave de NSUserActivityTypes
en Info.plist. A continuación, puede controlar este caso cuando se abra la aplicación y realizar operaciones específicas (como abrir a un controlador de vista relevante y cargar los datos desde la operación de Siri).
En el ejemplo también se codifica el resultado de Success
, pero en escenarios reales, se deben agregar informes de errores adecuados.
Frases de prueba
Las siguientes frases de prueba deben funcionar en la aplicación de ejemplo:
- "Haz una lista de la compra con manzanas, plátanos y guisantes en TasksNotes"
- "Agrega WWDC en TasksNotes"
- "Agrega WWDC a la lista de entrenamiento en TasksNotes"
- "Marca atender WWDC como completado en TasksNotes"
- "En TasksNotes recuérdame que compre un iphone cuando llegue a casa"
- "Marca comprar iPhone como completado en TasksNotes"
- "Recuérdame que salga de casa a las 8:00 en TasksNotes"
Nota:
El simulador de iOS 11 admite pruebas con Siri (a diferencia de las versiones anteriores).
Si realiza pruebas en dispositivos reales, no olvide configurar el identificador de aplicación y los perfiles de aprovisionamiento para la compatibilidad con SiriKit.
Nombres alternativos
Esta nueva característica de iOS 11 significa que puede configurar nombres alternativos para la aplicación para ayudar a los usuarios a desencadenarlo correctamente con Siri. Agregue las claves siguientes al archivo Info.plist del proyecto de aplicación de iOS:
Con los nombres de aplicación alternativos establecidos, las siguientes frases también funcionarán para la aplicación de ejemplo (que en realidad se denomina TasksNotes):
- "Haz una lista de la compra con manzanas, plátanos y guisantes en MonkeyNotes"
- "Agrega la tarea WWDC en MonkeyTodo"
Solución de problemas
Algunos errores que pueden producirse al ejecutar el ejemplo o agregar SiriKit a sus propias aplicaciones:
NSInternalInconsistencyException
Se inicia una excepción Objective-C Nombre: NSInternalInconsistencyException Reason: El uso de la clase <INPreferences: 0x60400082ff00> de una aplicación requiere el derecho com.apple.developer.siri. ¿Habilitó la funcionalidad Siri en el proyecto de Xcode?
SiriKit se marca en Entitlements.plist.
Entitlements.plist se configura en Opciones de proyecto > Compilación > Firma de lote de iOS.
(para la implementación de dispositivos) El identificador de aplicación tiene SiriKit habilitado y el perfil de aprovisionamiento descargado.