Raccourcis Siri - comment les mettre en œuvre ?

Publié: 2020-01-16

Les raccourcis Siri, une nouvelle fonctionnalité présentée à la WWDC de l'année dernière, offrent la possibilité d'exécuter certaines fonctionnalités de l'application en arrière-plan. Nous n'avons pas besoin d'allumer l'application pour utiliser ces fonctionnalités dans l'application, nous pouvons simplement dire à Siri, par exemple "Burger Time" et le système sait à quelle application ce raccourci est attribué et commande un hamburger pour nous.

Que sont les raccourcis Siri ?

  • Un moyen pratique d'accomplir des tâches à partir de l'écran de verrouillage ou de la zone de recherche.
  • Des raccourcis peuvent également être ajoutés à Siri pour fonctionner avec une phrase vocale sur iOS, HomePod et watchOS.
  • Les développeurs ajoutent des crochets de raccourci dans leurs applications qui permettent à Siri de se connecter à ces raccourcis.
  • Utiliser des modèles d'apprentissage automatique de votre comportement pour analyser les fonctions courantes que vous exécutez et suggérer automatiquement des raccourcis.
  • iOS 12+

Dans cet article, nous nous concentrerons sur la mise en œuvre du raccourci de commande, l'une des applications les plus populaires des raccourcis Siri. Nous allons créer une application simple qui vous permettra de commander des burgers

Comment pouvons-nous créer des raccourcis Siri ?

Processus de création de raccourcis Siri
  1. Au tout début, nous devons penser à la fonctionnalité que l'utilisateur veut vraiment faciliter dans notre application . Il doit s'agir d'une fonctionnalité que l'utilisateur exécute fréquemment et qui nécessite que l'utilisateur entre dans l'application et y transmette un long chemin. Les raccourcis permettront de raccourcir ce chemin pour exécuter la fonctionnalité.
  2. À l'étape suivante, vous devez donner un raccourci. Qu'est-ce que ça veut dire? Nous devons transmettre l'information au système sur le fait que nous avons passé une commande, par exemple un hamburger avec du bacon. Nous fournissons ces informations au système et plus tard, Siri peut nous suggérer à un moment précis de passer cette commande spécifique.
  3. La dernière chose à faire est de gérer ce raccourci, qui se produit lorsque l'utilisateur indique à Siri la commande définie précédemment , par exemple "Burger time", ou dans le cas où l'utilisateur appuie sur le raccourci proposé par Siri sur l'écran de verrouillage.

Ok, peut-être qu'on va écrire du code ? Quelles sont nos possibilités en tant que développeurs ?

NSUserActivity & Intents - exemples de raccourcis Siri

NSUserActivity — Nous allons créer un raccourci qui nous permettra de lancer l'écran pour passer une nouvelle commande

  1. Ajouter la clé à Info.plist
 <key>NSUserActivityTypes</key>
<tableau>
	<string>com.miquido.SiriShotcutDemo.make-order</string>
</array>

2. Donnez le raccourci lorsque l'utilisateur entre dans l'écran

 laissez orderActivity = NSUserActivity (activityType : "com.miquido.SiriShotcutDemo.make-order")
orderActivity.persistentIdentifier = NSUserActivityPersistentIdentifier("com.miquido.SiriShotcutDemo.make-order")
orderActivity.isEligibleForSearch = vrai
orderActivity.isEligibleForPrediction = true
orderActivity.title = "Passer une commande"
orderActivity.suggestedInvocationPhrase = "Heure du hamburger"

let attributs = CSSearchableItemAttributeSet(itemContentType : kUTTypeItem as String)
attributs.contentDescription = "Délicieux hamburgers !"
attributs.thumbnailData = UIImage(nommé : "logo") ?.pngData()
orderActivity.contentAttributeSet = attributs
userActivity = orderActivity

3. Dans AppDelegate , vous devez implémenter le délégué continueUserActivity qui, après avoir obtenu ce type particulier, redirigera vers l'écran donné

 func application(_ application : UIApplication,
                 continuer userActivity : NSUserActivity,
                 restoreHandler : @escaping ([UIUserActivityRestoring] ?) -> Void) -> Bool {
    if userActivity.activityType == "com.miquido.SiriShotcutDemo.make-order" {
        // gérer l'application ouverte sur l'écran de commande
        retourner vrai
    } 
    retourner faux
} 
Processus d'implémentation des raccourcis Siri pour commander un burger

Intentions — Nous allons implémenter un raccourci pour passer des commandes

Conseil de pro avant la mise en œuvre :
Les intentions apparaissent lorsque l'utilisateur fait quelque chose systématiquement. Cependant, lorsque vous souhaitez tester cette fonctionnalité afin de toujours recevoir une suggestion de Siri, vous devez activer deux options - " Afficher les raccourcis récents " et " Afficher les dons sur l'écran de verrouillage " dans Paramètres -> Développeur.

Les options : Afficher les raccourcis récents et Afficher les dons sur l'écran de verrouillage
  1. Créez un fichier de définition d'intention. Le meilleur moyen est de l'ajouter à un framework séparé dans mon projet, ce sera dans OrderKit .
Icône du fichier de définition d'intention SiriKit

2. Sélectionnez une catégorie, dans ce cas "Commande". Dans ce fichier, nous devons choisir les paramètres que nous transmettrons au système et créer des combinaisons de ces paramètres.

Intention personnalisée, paramètres et types de raccourcis
Définition de la commande – Créer une intention personnalisée
Définition de la commande — Définir les réponses
Définition de la commande — Définir les réponses

3. Créez une nouvelle cible avec une extension pour les intentions, sélectionnez "Inclure l'extension de l'interface utilisateur" lorsque vous la créez.

Icône d'extension d'intention
Fichier -> Nouveau -> Cible… -> Extension d'intentions
Voici à quoi devrait ressembler l'adhésion cible pour Order.intentdefinition

4. Créez une interface utilisateur pour l'intention dans le fichier MainInterface.storyboard .

Création d'une interface utilisateur pour l'intent
Créer une interface utilisateur pour notre intention

5. Configurez l' ready et success dans IntentViewController .

 func configureView(pour les paramètres : Set<INParameter>,
                       d'interaction : INInteraction,
                       Comportementinteractif : INUIComportementInteractif,
                       contexte : INUIHostedViewContext,
                       complétion : @escaping (Bool, Set<INParameter>, CGSize) -> Void) {
        
    guard let intent = interaction.intent as? OrderIntent else {
        achèvement (faux, Set(), .zero)
        revenir
    }
    si interaction.intentHandlingStatus == .ready {
        configuration (avec : intention)
        waitTime.isHidden = vrai
        complétion (vrai, paramètres, taille souhaitée)
    } sinon si interaction.intentHandlingStatus == .success,
        laisser réponse = interaction.intentResponse comme ? OrderIntentReponse {
        configuration (avec : intention)
        waitTime.isHidden = faux
        si laissez waitTimeText = response.waitTime {
            waitTime.text = "La commande sera prête dans \(waitTimeText) minutes"
        }
        everythingIsOkLabel.text = "Appuyez pour afficher les commandes"
        complétion (vrai, paramètres, taille souhaitée)
    }

    complétion(false, paramètres, .zero)
}

configuration de la fonction privée (avec l'intention : OrderIntent) {
    burgerNameLabel.text = intent.burgerName
    si laisser quantité = intent.quantity?.stringValue {
        quantiteLabel.text = "\(quantite) pc."
    }
    if let additions = intent.additions {
        additionsLabel.text = additions.elements.toString
    }
}

6. Après avoir créé l'interface utilisateur, nous pouvons accéder au don de notre intention. Dans ce cas, il est préférable de faire don d'intentions lors de la commande. Nous fournissons au système toutes les informations que nous avons précédemment définies dans le fichier Order.intentdefinition , c'est-à-dire le nom du burger, la quantité et les ajouts, et la phrase proposée affichée dans le cas où nous voudrions ajouter immédiatement ce raccourci à Siri lors de la commande .

 fonction privée donateInteraction(for order: Order) {
    let interaction = INInteraction(intent: order.intent, response: nil)
    
    interaction.donate { (erreur) dans
        si erreur != néant {
            // gérer l'erreur
        } autre {
            print("Interaction donnée avec succès")
        }
    }
} 
 commande d'extension publique {
    
    var intention : OrderIntent {
        laissez orderIntent = OrderIntent()
        orderIntent.burgerName = nom
        if let intValue = Int(quantité) {
            orderIntent.quantity = NSNumber(valeur : intValue)
        }
        orderIntent.suggestedInvocationPhrase = "Heure du hamburger"
        
        orderIntent.additions = additions.map { option -> INObject dans
            return INObject(identifiant : option.rawValue,
                            affichage : option.rawValue)
        }
        commande de retourIntention
    }
    
}

7. Nous pouvons maintenant gérer la situation dans le cas où l'utilisateur reçoit la suggestion d'un raccourci et clique dessus et dans le cas où l'utilisateur appelle le raccourci par Siri.

 classe publique OrderIntentHandler : NSObject, OrderIntentHandling {
    
    public func confirm(intent: OrderIntent,
                        complétion : @escaping (OrderIntentResponse) -> Void) {
        achèvement (OrderIntentResponse (code : OrderIntentResponseCode.ready, userActivity : nil))
    }
    
    public func handle(intent: OrderIntent, 
                       complétion : @escaping (OrderIntentResponse) -> Void) {
        guard let burgerName = intent.burgerName else {
            achèvement (OrderIntentResponse (code : .failure, userActivity : nil))
            revenir
        }
        
        Defaults.save(ordre : Ordre(de : intention))
        achèvement(OrderIntentResponse.success(burgerName : burgerName, waitTime : "5"))
    }
    
} 
Démo du raccourci Siri

C'est tout, tout fonctionne

Vous pouvez consulter l'ensemble du projet sur mon GitHub ici

Sources:

  • 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