Atajos de Siri: ¿cómo implementarlos?

Publicado: 2020-01-16

Los accesos directos de Siri, una nueva característica presentada en la WWDC del año pasado, ofrecen la posibilidad de realizar ciertas funcionalidades de la aplicación en segundo plano. No tenemos que encender la aplicación para usar estas funcionalidades en la aplicación, simplemente podemos decirle a Siri, por ejemplo, "Burger Time" y el sistema sabe a qué aplicación está asignado este acceso directo y nos pide una hamburguesa.

¿Qué son los atajos de Siri?

  • Una forma conveniente de realizar tareas desde la pantalla de bloqueo o el área de búsqueda.
  • También se pueden agregar accesos directos a Siri para que se ejecuten con una frase de voz en iOS, HomePod y watchOS.
  • Los desarrolladores agregan enlaces de atajos en sus aplicaciones que permiten a Siri conectarse a estos atajos.
  • Usar modelos de aprendizaje automático de su comportamiento para analizar funciones comunes que realiza y sugerir atajos automáticamente.
  • iOS 12+

En este artículo nos centraremos en la implementación del atajo de pedidos, una de las aplicaciones más populares de Atajos de Siri. Crearemos una sencilla aplicación que te permitirá pedir hamburguesas

¿Cómo podemos crear atajos de Siri?

Proceso de creación de atajos de Siri
  1. Al principio, tenemos que pensar en la funcionalidad que el usuario realmente quiere que sea más fácil en nuestra aplicación . Esta debería ser una funcionalidad que el usuario realiza con frecuencia y requiere que el usuario ingrese a la aplicación y pase un largo camino en ella. Los accesos directos permitirán acortar esta ruta para realizar la funcionalidad.
  2. En el siguiente paso, debe donar un acceso directo. ¿Qué significa esto? Debemos pasar la información al sistema sobre el hecho de que hemos hecho un pedido, por ejemplo una hamburguesa con tocino. Esta información la proporcionamos al sistema y posteriormente Siri puede sugerirnos en un momento concreto para realizar ese pedido concreto.
  3. Lo último que debe hacer es manejar este atajo, lo que sucede cuando el usuario le dice a Siri el comando definido anteriormente , por ejemplo, "Hora de la hamburguesa", o en el caso de que el usuario presione el atajo sugerido por Siri en la pantalla de bloqueo.

Ok, ¿quizás escribamos algo de código? ¿Cuáles son nuestras posibilidades como desarrolladores?

NSUserActivity & Intents: ejemplos de atajos de Siri

NSUserActivity — Crearemos un acceso directo que nos permitirá abrir la pantalla para realizar un nuevo pedido

  1. Agregue la clave a Info.plist
 <key>NSUserActivityTypes</key>
<matriz>
	<string>com.miquido.SiriShotcutDemo.make-order</string>
</matriz>

2. Dona el atajo cuando el usuario ingresa a la pantalla

 let orderActivity = NSUserActivity(activityType: "com.miquido.SiriShotcutDemo.make-order")
orderActivity.persistentIdentifier = NSUserActivityPersistentIdentifier("com.miquido.SiriShotcutDemo.make-order")
orderActivity.isElegibleForSearch = verdadero
orderActivity.isElegibleForPrediction = true
orderActivity.title = "Hacer un pedido"
orderActivity.suggestedInvocationPhrase = "Hora de la hamburguesa"

let atributos = CSSearchableItemAttributeSet(itemContentType: kUTTypeItem as String)
atributos.contentDescription = "¡Deliciosas hamburguesas!"
atributos.thumbnailData = UIImage(llamado: "logotipo")?.pngData()
orderActivity.contentAttributeSet = atributos
actividad de usuario = actividad de pedido

3. En AppDelegate , debe implementar el delegado continueUserActivity que, después de obtener este tipo en particular, redirigirá a la pantalla dada

 aplicación func(_ aplicación: UIApplication,
                 continuar actividad de usuario: NSUserActivity,
                 restoreHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
    if userActivity.activityType == "com.miquido.SiriShotcutDemo.make-order" {
        // manejar la aplicación abierta en la pantalla de pedido
        volver verdadero
    } 
    falso retorno
} 
Proceso de implementación de atajos de Siri para pedir una hamburguesa

Intents — Implementaremos un atajo para hacer pedidos

Consejo profesional antes de la implementación:
Las intenciones aparecen cuando el usuario hace algo sistemáticamente. Sin embargo, cuando desee probar esta funcionalidad para que siempre reciba una sugerencia de Siri, debe habilitar dos opciones: " Mostrar accesos directos recientes " y " Mostrar donaciones en la pantalla de bloqueo " en Configuración -> Desarrollador.

Las opciones: Mostrar accesos directos recientes y Mostrar donaciones en la pantalla de bloqueo
  1. Cree un archivo de definición de intenciones. La mejor manera es agregarlo a un marco separado en mi proyecto, estará en OrderKit .
Ícono de archivo de definición de intenciones de SiriKit

2. Selecciona una categoría, en este caso “Pedido”. En este archivo tenemos que elegir los parámetros que pasaremos al sistema y crear combinaciones de estos parámetros.

Intención personalizada, parámetros y tipos de atajos
Definición de pedido: crea una intención personalizada
Definición de pedido — Definir respuestas
Definición de pedido — Definir respuestas

3. Cree un nuevo objetivo con una extensión para intenciones, seleccione "Incluir extensión de UI" cuando lo esté creando.

Ícono de extensión de intenciones
Archivo -> Nuevo -> Destino… -> Extensión de intenciones
Así es como debería verse la Membresía de destino para Order.intentdefinition

4. Cree una interfaz de usuario para la intención en el archivo MainInterface.storyboard .

Creación de interfaz de usuario para la intención
Crear interfaz de usuario para nuestra intención

5. Configure el estado ready y IntentViewController success

 func configureView(para parámetros: Set<INParameter>,
                       de interacción: INInteraction,
                       Comportamiento interactivo: INUIComportamiento interactivo,
                       contexto: INUIHostedViewContext,
                       finalización: @escaping (Bool, Set<INParameter>, CGSize) -> Void) {
        
    guard let intent = interacción.intento as? OrderIntent else {
        finalización (falso, Set (), .cero)
        devolver
    }
    si interacción.intentHandlingStatus == .ready {
        configuración (con: intención)
        tiempodeespera.isHidden = true
        finalización (verdadero, parámetros, tamaño deseado)
    } else if interacción.intentHandlingStatus == .success,
        let respuesta = interacción.intentResponse as? OrdenIntentResponse {
        configuración (con: intención)
        tiempodeespera.isHidden = false
        if let waitTimeText = respuesta.waitTime {
            waitTime.text = "El pedido estará listo en \(waitTimeText) minutos"
        }
        everythingIsOkLabel.text = "Toca para mostrar los pedidos"
        finalización (verdadero, parámetros, tamaño deseado)
    }

    finalización (falso, parámetros, .cero)
}

configuración de función privada (con intención: OrderIntent) {
    burgerNameLabel.text = intent.burgerName
    si let cantidad = intención.cantidad?.stringValue {
        cantidadLabel.text = "\(cantidad) piezas".
    }
    if let adiciones = intent.additions {
        adicionesLabel.text = adiciones.elements.toString
    }
}

6. Después de crear la interfaz de usuario, podemos ir a la donación de nuestra intención. En este caso, lo mejor es donar intenciones al realizar el pedido. Proporcionamos toda la información al sistema que definimos previamente en el archivo Order.intentdefinition , es decir, el nombre de la hamburguesa, la cantidad y las adiciones, y la frase propuesta que se muestra en el caso de que quisiéramos agregar inmediatamente este acceso directo a Siri al realizar el pedido. .

 función privada donarInteracción(para pedido: Pedido) {
    let interacción = INInteracción (intención: pedido. intención, respuesta: nil)
    
    interacción.donar { (error) en
        si error != nil {
            // manejar el error
        } más {
            print("Interacción donada con éxito")
        }
    }
} 
 orden de extensión pública {
    
    intención de var: OrderIntent {
        let orderIntent = OrderIntent()
        orderIntent.burgerName = nombre
        if let intValue = Int(cantidad) {
            orderIntent.quantity = NSNumber(value: intValue)
        }
        orderIntent.suggestedInvocationPhrase = "Hora de la hamburguesa"
        
        orderIntent.additions = addeds.map { opción -> INObject en
            devuelve INObject(identificador: opción.rawValue,
                            pantalla: opción.rawValue)
        }
        orden de devoluciónIntento
    }
    
}

7. Ahora podemos manejar la situación de lo que sucederá en el caso de que el usuario reciba la sugerencia de un atajo y haga clic en él y en caso de que el usuario llame al atajo de Siri.

 clase pública OrderIntentHandler: NSObject, OrderIntentHandling {
    
    confirmación de función pública (intención: OrderIntent,
                        finalización: @escaping (OrderIntentResponse) -> Void) {
        finalización (OrderIntentResponse (código: OrderIntentResponseCode.ready, userActivity: nil))
    }
    
    identificador de función pública (intención: OrderIntent, 
                       finalización: @escaping (OrderIntentResponse) -> Void) {
        guard let burgerName = intent.burgerName else {
            finalización (OrderIntentResponse (código: .failure, userActivity: nil))
            devolver
        }
        
        Valores predeterminados. guardar (pedido: pedido (de: intención))
        finalización (OrderIntentResponse.success(burgerName: burgerName, waitTime: "5"))
    }
    
} 
Demostración de atajos de Siri

Eso es todo, todo funciona.

Puedes consultar todo el proyecto en mi GitHub aquí

Fuentes:

  • https://developer.apple.com/videos/play/wwdc2018/211/
  • https://developer.apple.com/videos/play/wwdc2018/214/
  • https://developer.apple.com/documentation/sirikit/donating_shortcuts
  • https://developer.apple.com/design/human-interface-guidelines/sirikit/overview/siri-shortcuts/
  • https://www.raywenderlich.com/6462-siri-shortcuts-tutorial-in-ios-12