Crea extensiones de SiriKit en iOS 10

Lo que vas a crear

Introducción

Desde que Siri se presentó en 2011, los desarrolladores de iOS han estado solicitando la posibilidad de integrar aplicaciones de terceros con él. Con el lanzamiento de iOS 10 durante la WWDC 2016, Apple finalmente puso a disposición de los desarrolladores SiriKit. Todavía hay algunas restricciones sobre qué tipos de aplicaciones pueden aprovechar Siri, pero es un paso en la dirección correcta. Echemos un vistazo a lo que podemos hacer con Siri.

Para más información sobre SiriKit y las otras nuevas características para desarrolladores en iOS 10, consulte el curso de Markus Mühlberger, aquí mismo, en Envato Tuts+.

Dominios soportados

Para utilizar SiriKit, su aplicación debe estar en uno o más de los siguientes dominios:

  • Llamadas VoIP (por ejemplo, Skype)
  • Mensajería (WhatsApp)
  • Pagos (Plaza, PayPal)
  • Foto (Fotos)
  • Entrenamientos (Runtastic)
  • Reserva de viaje (Uber, Lyft)
  • CarPlay (solo vendedores de automóviles)
  • Reservas en restaurantes (requiere soporte adicional de Apple)

Si su aplicación no pertenece a ninguna de estas categorías, lamentablemente no puede usar Siri en su aplicación en este momento. No se vaya todavía, sin embargo, porque SiriKit es muy poderoso y puede ganar nuevas capacidades en el futuro!

Arquitectura de extensión

Una extensión de SiriKit en realidad se compone de dos tipos de extensión. Un Intenciones se requiere una extensión y se encarga de manejar las solicitudes del usuario y de ejecutar una tarea específica en su aplicación (como iniciar una llamada, enviar un mensaje, etc.).

Por otro lado, una IntencionesUI La extensión no es obligatoria. Solo debe crear uno si desea personalizar la interfaz de usuario que muestra Siri cuando presenta sus datos. Si no lo hace, se mostrará la interfaz estándar de Siri. Vamos a echar un vistazo a ambos tipos de extensión en este tutorial.

Para su información, durante la WWDC 2016, Apple lanzó dos videos muy interesantes sobre SiriKit. Es posible que desee revisarlos:

  • Presentación de SiriKit - Sesión 217
  • Ampliando sus aplicaciones con SiriKit - Sesión 225

Proyecto de ejemplo

Vamos a construir una aplicación simple que procesa los pagos a través de Siri. El objetivo es procesar con éxito la oración "Enviar $ 20 a Patrick a través de TutsplusPayments". El formato de la oración consiste en una cantidad de dinero con una moneda específica, el nombre del beneficiario y la aplicación que se usará para completar la transacción. Más adelante vamos a analizar el intento de pago con más detalle..

Configuración inicial

Comencemos creando un proyecto Xcode estándar en Swift y dándole un nombre. Hay algunos pasos obligatorios que debe realizar antes de escribir cualquier código para permitir que su aplicación use las API de Siri.

1. Seleccione tu alquitránobtener> Capacidades y habilitar la capacidad de Siri. Asegúrese de que los derechos se crearon correctamente en la estructura de su proyecto.

2. Abre tu aplicación Info.plist y agrega la llave NSSiriUsageDescription. El valor debe ser una cadena que explique el uso de Siri que se mostrará al usuario cuando se le solicite el permiso inicial.

3. Seleccione Archivo> Nuevo> Objetivo. En la nueva ventana presentada por Xcode, bajo Extensiones de aplicación, escoger Extensión de intenciones. También seleccione la opción para incluir una extensión de UI. Esto te evitará tener que crear otra extensión por separado..

En el Info.plist archivo de su recién creado Intenciones objetivo, expandir completamente el NSExtensión Diccionario para estudiar sus contenidos. El diccionario describe con más detalle qué intentos admite su extensión y si desea permitir que el usuario invoque un intento mientras el dispositivo está bloqueado.. 

Inserte los intentos más relevantes en la parte superior si desea admitir más de uno. Siri usa este orden para averiguar cuál quiere usar el usuario en caso de ambigüedad.

Ahora necesitamos definir qué intentos queremos apoyar. En este ejemplo, vamos a construir una extensión que admita el intento de pago. Modificar el Info.plist archivo para que coincida con la siguiente imagen.

Aquí especificamos que queremos manejar el INSENDPaymentIntent y que requerimos que el dispositivo esté desbloqueado. No queremos que extraños envíen pagos cuando el dispositivo se pierde o es robado!

iOS objetivo

El siguiente paso consiste en escribir algo de código en la aplicación iOS. Tenemos que pedirle al usuario permiso para enviar su voz a Apple para su análisis. Simplemente tenemos que importar el Intenciones marco y llamar al método apropiado de la siguiente manera:

Importe UIKit Importe clase de intenciones ViewController: UIViewController override func viewDidLoad () super.viewDidLoad () // Solicite permiso para acceder a Siri INPreferences.requestSiriAuthorization authorityStatus in switch permissionStatus case .authorized: print ("Authorized") predeterminado: print ( "No autorizado")     

El diálogo resultante presentado al usuario durante el primer lanzamiento de la aplicación se verá así.

Esto es todo lo que tenemos que hacer en nuestra aplicación iOS simple. Entremos en el mundo de las extensiones ahora.!

Extensión de intenciones

Cambiar a la Intenciones extensión que hemos creado anteriormente. Expandir su contenido en el navegador de proyectos Xcode. Verás solo un archivo llamado IntentHandler.swift.

Este archivo es el punto de entrada de su extensión y se utiliza para manejar cualquier intento que Siri le envíe. Siri reenviará a la manejador (para :) Método todos los intentos en caso de que su extensión es compatible con varios tipos. Es tu trabajo verificar el tipo de INCIENTE objetar y manejarlo apropiadamente.

los IntentHandler.swift La plantilla ya contiene una implementación de ejemplo de un intento de mensajería. Reemplace todo el código con el siguiente método vacío para que podamos caminar juntos a través de cada paso.

clase IntentHandler: INExtension override func handler (para intención: INIntent) -> Any? // Esta es la implementación por defecto. Si desea que diferentes objetos manejen diferentes intentos, // puede anular esto y devolver el controlador que desea para ese intento en particular. volver a sí mismo

Cada intento tiene un protocolo asociado para asegurarse de que una clase implemente todos los métodos requeridos. La mayoría de los protocolos en el marco de intenciones tienen la misma estructura.

El protocolo que vamos a implementar se llama. INSENDPaymentIntentHandling. Este protocolo contiene los siguientes métodos obligatorios y opcionales:

  • Necesario:
    manejar (enviar Pago: finalización :) 
  • Opcional:
    confirmar (enviar Pago: finalización :) 
    resolverPayee (forSendPayment: with :)
    resolverCurrencyAmount (forSendPayment: with :)
    resolverNote (forSendPayment: with :)

Vamos a crear una extensión de la IntentHandler clase en el mismo archivo Swift para implementar el único método requerido.

extensión IntentHandler: INSendPaymentIntentHandling func handle (sendPayment intent: INSendPaymentIntent, finalización: @escaping (INSendPaymentIntentResponse) -> Void) // Compruebe que tenemos valores válidos para el beneficiario y currencyAmount guard letee = intent.payee, permita que la cantidad sea la intención. currencyAmount else return completed (INSendPaymentIntentResponse (código: .unspecified, userActivity: nil)) // ¡Haga su pago! imprimir ("Enviando \ (cantidad) pago a \ (beneficiario)!") finalización (INSendPaymentIntentResponse (código: .success, userActivity: nil))

Esta es una implementación muy básica. Nos aseguramos de que haya un valido tenedor y monedaAmount para establecer la transacción como exitosa. Puede que no lo creas, ¡pero ya funciona! Seleccione el esquema de intenciones de Xcode y ejecútelo. Cuando Xcode presenta el menú habitual para elegir una aplicación para ejecutar, seleccione Siri.

Cuando Siri comience, intente decir "Envíe $ 20 a Patrick a través de TutsplusPayments". Ahora disfruta de tu primer pago exitoso completado con tu voz!

También puede intentar probar el caso que falla. Intente decir la misma oración que antes pero sin especificar el beneficiario (es decir, "Enviar $ 20 a través de TutsplusPayments"). Verá que Siri fallará y le presentará al usuario un botón para continuar con el pago en su aplicación.

En caso de que Siri no comprenda o no tenga uno de los parámetros opcionales pero requiera un valor válido, puede implementar uno de los métodos de resolución. Esos métodos ofrecen al usuario una opción para proporcionar más detalles sobre el pago, como el nombre del beneficiario, el monto exacto de la moneda e incluso una nota. Con esta arquitectura inteligente de la API, a usted como desarrollador se le presenta la posibilidad de entender fácil y claramente la solicitud de su usuario de diferentes maneras.

En una aplicación del mundo real, crearía un marco dinámico que se comparte entre la aplicación de iOS y las extensiones. Al hacer uso de esta arquitectura, puede compartir la misma lógica de negocios en múltiples objetivos. No tendrá que implementarlo varias veces, sino solo una vez para todos los objetivos!

Intentos UI Extension

En la última parte de este tutorial, le mostraré cómo puede personalizar la interfaz de usuario que muestra Siri.

En primer lugar, recuerde establecer la clase de intención correcta que desea manejar en el Info.plist del ExtensiónUI, como hicimos en la sección anterior.

Salte a la extensión Intents UI y verá la plantilla que Xcode ha creado para usted. Contiene una IntentViewController, que es una subclase simple de UIViewController que implementa el INUIHostedViewControlling protocolo. También se creó un archivo de guión gráfico para ti; Ábrelo para que podamos empezar a personalizar la interfaz de usuario..

Agrega un UIImageView Como fondo y una etiqueta en el centro. Descargue la imagen de fondo, impórtela en el objetivo Intents UI y configúrela como la imagen de la nueva creación. UIImageView. Crear un UILabel Objetar y posicionarlo en el centro de la vista. Usted puede usar fácilmente AutoLayout para configurar las restricciones en Storyboard.

Abra el Editor Asistente y cree un @IBOutlet para su etiqueta y llámelo contentLabel. El resultado debería verse como algo así:

Abre el IntentViewController Archivo y verás un montón de código de ejemplo. Puede eliminar todo excepto el configurar (con: contexto: finalización :) Método que vamos a implementar ahora. Este método se llama cuando la interfaz de usuario está lista para ser configurada. Lo que tenemos que hacer aquí es establecer el contenido de la UILabel.

clase IntentViewController: UIViewController, INUIHostedViewControlling @IBOutlet weak var contentLabel: UILabel! // MARK: - INUIHostedViewControlling func configure (con interacción: INInteraction !, contexto: INUIHostedViewContext, finalización: ((CGSize) -> Void)!) If let paymentIntent = interaccion.intent como? INSendPaymentIntent // Si alguna de estas propiedades no está establecida, use la IU predeterminada. guard let amount = paymentIntent.currencyAmount? .amount, let currency = paymentIntent.currencyAmount? .currencyCode, let name = paymentIntent.payee? .displayName else return complete (CGSize.zero) let paymentDescription = "\ (cantidad) \ ( Moneda) a \ (nombre) "contentLabel.text = paymentDescription si se permite completar = completar completar (self.desiredSize) var desiredSize: CGSize return self.extensionContext! .hostedViewMaximumAllowedSize

En primer lugar, comprobamos que la intención objeto es de tipo INSENDPaymentIntent. Si es así, también nos aseguramos de que todas las propiedades que queremos mostrar no sean nulo, de lo contrario, simplemente llamamos al bloque de finalización con un tamaño de cero para ocultar nuestra vista personalizada. Si todo sale como esperamos, creamos una cadena personalizada con los datos que queremos mostrar al usuario y la configuramos como el texto de la contentLabel.

Ejecute la extensión nuevamente y verá la nueva vista dentro de Siri!

Siri todavía muestra la vista por defecto. Podemos ocultarlo haciendo que nuestro controlador de vista se ajuste a la INUIHostedViewSiriProviding protocolo.

clase IntentViewController: UIViewController, INUIHostedViewControlling, INUIHostedViewSiriProviding // El código anterior va aquí ... var displaysPaymentTransaction: Bool return true

Volviendo cierto en el displaysPaymentTransaction variable, le decimos a Siri que nuestro controlador de vista se ocupa de mostrar toda la información necesaria al usuario y que la vista predeterminada puede estar oculta. El resultado es mucho más limpio ahora.!

Nota: Como puede ver en esta imagen, al especificar una moneda diferente a los dólares estadounidenses, Siri entiende correctamente y devuelve el código de moneda a la extensión. Desafortunadamente, el texto siempre muestra dólares estadounidenses. He reportado este error a Apple!

Conclusión

Espero que hayas disfrutado este tutorial. Siri es muy potente incluso si está limitado a algunos tipos de aplicaciones en este momento. Si planea implementarlo en sus propias aplicaciones, asegúrese de promocionarlo bien para sus usuarios, ya que es posible que no sepan qué tan genial y avanzado se ha vuelto su aplicación.!

Si desea obtener más información sobre la integración de Siri en su aplicación, o si desea conocer algunas de las otras funciones de desarrollador de iOS 10, consulte el curso de Markus Mühlberger.

Además, echa un vistazo a algunos de nuestros otros tutoriales gratuitos sobre las características de iOS 10.