Implémentation de SiriKit dans Xamarin.iOS
Cet article décrit les étapes requises pour implémenter la prise en charge de SiriKit dans des applications Xamarin.iOS.
Nouveautés d’iOS 10, SiriKit permet à une application Xamarin.iOS de fournir des services accessibles à l’utilisateur à l’aide de Siri et de l’application Maps sur un appareil iOS. Cet article décrit les étapes requises pour implémenter la prise en charge de SiriKit dans les applications Xamarin.iOS en ajoutant les extensions intents, les extensions d’interface utilisateur intents et le vocabulaire requis.
Siri fonctionne avec le concept de domaines, de groupes d’actions de connaissance pour les tâches associées. Chaque interaction que l’application a avec Siri doit se trouver dans l’un de ses domaines de service connus comme suit :
- Appel audio ou vidéo.
- Réservation d’un tour.
- Gestion des séances d’entraînement.
- Messagerie.
- Recherche de photos.
- Envoi ou réception de paiements.
Lorsque l’utilisateur effectue une demande de Siri impliquant l’un des services de l’extension d’application, SiriKit envoie l’extension à un objet Intent qui décrit la demande de l’utilisateur ainsi que les données de prise en charge. l’extension d’application génère ensuite l’objet Response approprié pour l’intention donnée, en détaillant la façon dont l’extension peut gérer la requête.
Ce guide présente un exemple rapide d’inclusion de la prise en charge de SiriKit dans une application existante. Pour l’amour de cet exemple, nous allons utiliser l’application Fake MonkeyChat :
MonkeyChat conserve son propre carnet de contacts des amis de l’utilisateur, chacun associé à un nom d’écran (par exemple Bobo) et permet à l’utilisateur d’envoyer des conversations texte à chaque ami par son nom d’écran.
Extension de l’application avec SiriKit
Comme indiqué dans le guide Understanding SiriKit Concepts, il existe trois parties principales impliquées dans l’extension d’une application avec SiriKit :
Il s’agit notamment des paramètres suivants :
- Extension Intentions : vérifie les réponses des utilisateurs, confirme que l’application peut gérer la demande et effectue réellement la tâche pour répondre à la demande de l’utilisateur.
- L’extension d’interface - utilisateur intentions facultative fournit une interface utilisateur personnalisée aux réponses dans l’environnement Siri et peut apporter l’interface utilisateur et la personnalisation des applications dans Siri pour enrichir l’expérience de l’utilisateur.
- Application : fournit à l’application des vocabulaires spécifiques à l’utilisateur pour aider Siri à l’utiliser.
Tous ces éléments et les étapes à inclure dans l’application seront abordés en détail dans les sections ci-dessous.
Préparation de l’application
SiriKit est basé sur les extensions, cependant, avant d’ajouter des extensions à l’application, il existe quelques éléments que le développeur doit faire pour aider à l’adoption de SiriKit.
Déplacement du code partagé commun
Tout d’abord, le développeur peut déplacer certains du code commun qui sera partagé entre l’application et les extensions dans des projets partagés, des bibliothèques de classes portables (PCL) ou des bibliothèques natives.
Les extensions devront être en mesure d’effectuer toutes les opérations que l’application effectue. Dans les termes de l’exemple d’application MonkeyChat, des éléments tels que la recherche de contacts, l’ajout de nouveaux contacts, l’envoi de messages et l’historique des messages.
En déplaçant ce code commun dans un projet partagé, une bibliothèque PCL ou native, il facilite la maintenance de ce code dans un emplacement commun et garantit que l’extension et l’application parente fournissent des expériences et des fonctionnalités uniformes pour l’utilisateur.
Dans le cas de l’exemple d’application MonkeyChat, les modèles de données et le code de traitement, tels que l’accès au réseau et à la base de données, seront déplacés dans une bibliothèque native.
Effectuez les actions suivantes :
Démarrez Visual Studio pour Mac et ouvrez l’application MonkeyChat.
Cliquez avec le bouton droit sur le nom de la solution dans le panneau Solution, puis sélectionnez Ajouter>un nouveau projet... :
Sélectionnez bibliothèque de classes de bibliothèque>iOS>, puis cliquez sur le bouton Suivant :
Entrez
MonkeyChatCommon
le nom , puis cliquez sur le bouton Créer :Cliquez avec le bouton droit sur le dossier Références de l’application principale dans le Explorateur de solutions, puis sélectionnez Modifier les références.... Vérifiez le projet MonkeyChatCommon, puis cliquez sur le bouton OK :
Dans le Explorateur de solutions, faites glisser le code partagé commun de l’application principale vers la bibliothèque native.
Dans le cas de MonkeyChat, faites glisser les dossiers DataModels et Processeurs de l’application principale dans la bibliothèque native :
Modifiez les fichiers qui ont été déplacés vers la bibliothèque native et modifiez l’espace de noms pour qu’il corresponde à celui de la bibliothèque. Par exemple, passer MonkeyChat
à MonkeyChatCommon
:
using System;
namespace MonkeyChatCommon
{
/// <summary>
/// A message sent from one user to another within a conversation.
/// </summary>
public class MonkeyMessage
{
public MonkeyMessage ()
{
}
...
}
}
Ensuite, revenez à l’application principale et ajoutez une using
instruction pour l’espace de noms de la bibliothèque native partout où l’application utilise l’une des classes qui ont été déplacées :
using System;
using System.Collections.Generic;
using UIKit;
using Foundation;
using CoreGraphics;
using MonkeyChatCommon;
namespace MonkeyChat
{
public partial class MasterViewController : UITableViewController
{
public DetailViewController DetailViewController { get; set; }
DataSource dataSource;
...
}
}
Architecture de l’application pour les extensions
En règle générale, une application s’inscrit à plusieurs intentions et le développeur doit s’assurer que l’application est conçue pour le nombre approprié d’extensions d’intention.
Dans le cas où une application nécessite plusieurs intentions, le développeur a la possibilité de placer toute sa gestion de l’intention dans une extension d’intention ou de créer une extension d’intention distincte pour chaque intention.
Si vous choisissez de créer une extension d’intention distincte pour chaque intention, le développeur peut finir par dupliquer une grande quantité de code réutilisable dans chaque extension et créer une grande quantité de surcharge de processeur et de mémoire.
Pour vous aider à choisir entre les deux options, voir si l’une des intentions appartient naturellement ensemble. Par exemple, une application qui a effectué des appels audio et vidéo peut souhaiter inclure ces deux intentions dans une seule extension d’intention, car elles gèrent des tâches similaires et peuvent fournir la réutilisation du code la plus grande.
Pour toute intention ou groupe d’intentions qui ne s’intègrent pas à un groupe existant, créez une extension d’intention dans la solution de l’application pour les contenir.
Définition des droits requis
Toute application Xamarin.iOS qui inclut l’intégration de SiriKit doit avoir les droits appropriés définis. Si le développeur ne définit pas correctement ces droits requis, il ne pourra pas installer ou tester l’application sur du matériel iOS 10 (ou supérieur), ce qui est également nécessaire, car le simulateur iOS 10 ne prend pas en charge SiriKit.
Effectuez les actions suivantes :
Double-cliquez sur le
Entitlements.plist
fichier dans le Explorateur de solutions pour l’ouvrir pour modification.Basculez vers l’onglet Source.
Ajoutez la propriété, définissez le
com.apple.developer.siri
type surBoolean
et la valeur surYes
:Enregistrez les modifications du fichier.
Double-cliquez sur le fichier projet dans le Explorateur de solutions pour l’ouvrir pour modification.
Sélectionnez La signature de bundle iOS et vérifiez que le
Entitlements.plist
fichier est sélectionné dans le champ Droits personnalisés :Cliquez sur le bouton OK pour enregistrer les changements.
Une fois terminé, le fichier de l’application Entitlements.plist
doit ressembler à ce qui suit (ouvert dans un éditeur externe) :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.developer.siri</key>
<true/>
</dict>
</plist>
Approvisionnement correct de l’application
En raison de la sécurité stricte que Apple a placée autour de l’infrastructure SiriKit, toute application Xamarin.iOS qui implémente SiriKit doit avoir l’ID et les droits d’application appropriés (voir la section ci-dessus) et doit être signé avec un profil d’approvisionnement approprié.
Procédez comme suit sur votre Mac :
Dans un navigateur web, accédez à https://developer.apple.com votre compte et connectez-vous.
Cliquez sur Certificats, identificateurs et profils.
Sélectionnez Profils d’approvisionnement, puis sélectionnez ID d’application, puis cliquez sur le + bouton.
Entrez un nom pour le nouveau profil.
Entrez un ID d’offre groupée suivant la recommandation d’affectation de noms d’Apple.
Faites défiler jusqu’à la section App Services , sélectionnez SiriKit , puis cliquez sur le bouton Continuer :
Vérifiez tous les paramètres, puis envoyez l’ID d’application.
Sélectionnez Développement des profils>d’approvisionnement, cliquez sur le + bouton, sélectionnez l’ID Apple, puis cliquez sur Continuer.
Cliquez sur Sélectionner tout, puis sur Continuer.
Cliquez à nouveau sur Sélectionner tout , puis sur Continuer.
Entrez un nom de profil à l’aide des suggestions d’affectation de noms d’Apple, puis cliquez sur Continuer.
Démarrez Xcode.
Dans le menu Xcode, sélectionnez Préférences...
Sélectionnez Comptes, puis cliquez sur le bouton Afficher les détails... :
Cliquez sur le bouton Télécharger tous les profils dans le coin inférieur gauche :
Vérifiez que le profil d’approvisionnement créé ci-dessus a été installé dans Xcode.
Ouvrez le projet pour ajouter la prise en charge de SiriKit dans Visual Studio pour Mac.
Double-cliquez sur le
Info.plist
fichier dans le Explorateur de solutions.Vérifiez que l’identificateur de bundle correspond à celui créé dans le portail des développeurs d’Apple ci-dessus :
Dans le Explorateur de solutions, sélectionnez le projet.
Cliquez avec le bouton droit sur le projet et sélectionnez Options.
Sélectionnez la signature de bundle iOS, sélectionnez l’identité de signature et le profil d’approvisionnement créés ci-dessus :
Cliquez sur le bouton OK pour enregistrer les changements.
Important
Le test de SiriKit fonctionne uniquement sur un appareil matériel iOS 10 réel et non dans le simulateur iOS 10. Si vous rencontrez des problèmes lors de l’installation d’une application Xamarin.iOS compatible avec SiriKit sur du matériel réel, vérifiez que les droits requis, l’ID d’application, l’identificateur de signature et le profil d’approvisionnement ont été correctement configurés dans le portail des développeurs d’Apple et Visual Studio pour Mac.
Demande d’autorisation Siri
Avant que l’application ajoute un vocabulaire spécifique à l’utilisateur ou que les extensions d’intentions se connectent à Siri, elle doit demander l’autorisation de l’utilisateur pour accéder à Siri.
Modifiez le fichier de Info.plist
l’application, basculez vers la vue Source et ajoutez la NSSiriUsageDescription
clé avec une valeur de chaîne décrivant comment l’application utilisera Siri et quels types de données seront envoyés. Par exemple, l’application MonkeyChat peut dire « Les contacts MonkeyChat seront envoyés à Siri » :
Appelez la RequestSiriAuthorization
méthode de la INPreferences
classe au démarrage de l’application. Modifiez la AppDelegate.cs
classe et faites en sorte que la FinishedLaunching
méthode ressemble à ce qui suit :
using Intents;
...
public override bool FinishedLaunching (UIApplication application, NSDictionary launchOptions)
{
// Request access to Siri
INPreferences.RequestSiriAuthorization ((INSiriAuthorizationStatus status) => {
// Respond to returned status
switch (status) {
case INSiriAuthorizationStatus.Authorized:
break;
case INSiriAuthorizationStatus.Denied:
break;
case INSiriAuthorizationStatus.NotDetermined:
break;
case INSiriAuthorizationStatus.Restricted:
break;
}
});
return true;
}
La première fois que cette méthode est appelée, une alerte s’affiche en invitant l’utilisateur à autoriser l’application à accéder à Siri. Le message ajouté au NSSiriUsageDescription
développeur ci-dessus s’affiche dans cette alerte. Si l’utilisateur refuse initialement l’accès, il peut utiliser l’application Paramètres pour accorder l’accès à l’application.
À tout moment, l’application peut vérifier la capacité de l’application à accéder à Siri en appelant la SiriAuthorizationStatus
méthode de la INPreferences
classe.
Localisation et Siri
Sur un appareil iOS, l’utilisateur peut sélectionner une langue pour Siri différente, puis la valeur par défaut du système. Lorsque vous utilisez des données localisées, l’application doit utiliser la SiriLanguageCode
méthode de la INPreferences
classe pour obtenir le code de langue de Siri. Par exemple :
var language = INPreferences.SiriLanguageCode();
// Take action based on language
if (language == "en-US") {
// Do something...
}
Ajout d’un vocabulaire spécifique à l’utilisateur
Le vocabulaire spécifique de l’utilisateur va fournir des mots ou des expressions uniques à des utilisateurs individuels de l’application. Ceux-ci seront fournis lors de l’exécution à partir de l’application principale (et non les extensions d’application) en tant qu’ensemble ordonné de termes, classés dans une priorité d’utilisation la plus importante pour les utilisateurs, avec les termes les plus importants au début de la liste.
Le vocabulaire spécifique à l’utilisateur doit appartenir à l’une des catégories suivantes :
- Noms de contacts (qui ne sont pas gérés par l’infrastructure Contacts).
- Balises photo.
- Noms des albums photo.
- Noms d’entraînement.
Lors de la sélection de la terminologie pour s’inscrire en tant que vocabulaire personnalisé, choisissez uniquement des termes qui peuvent être mal compris par quelqu’un qui n’est pas familiarisé avec l’application. N’inscrivez jamais les termes courants tels que « Mon entraînement » ou « Mon album ». Par exemple, l’application MonkeyChat inscrit les surnoms associés à chaque contact dans le carnet d’adresses de l’utilisateur.
L’application fournit le vocabulaire spécifique utilisateur en appelant la SetVocabularyStrings
méthode de la INVocabulary
classe et en passant une NSOrderedSet
collection à partir de l’application principale. L’application doit d’abord appeler la RemoveAllVocabularyStrings
méthode pour supprimer les termes existants avant d’en ajouter de nouveaux. Par exemple :
using System;
using System.Linq;
using System.Collections.Generic;
using Foundation;
using Intents;
namespace MonkeyChatCommon
{
public class MonkeyAddressBook : NSObject
{
#region Computed Properties
public List<MonkeyContact> Contacts { get; set; } = new List<MonkeyContact> ();
#endregion
#region Constructors
public MonkeyAddressBook ()
{
}
#endregion
#region Public Methods
public NSOrderedSet<NSString> ContactNicknames ()
{
var nicknames = new NSMutableOrderedSet<NSString> ();
// Sort contacts by the last time used
var query = Contacts.OrderBy (contact => contact.LastCalledOn);
// Assemble ordered list of nicknames by most used to least
foreach (MonkeyContact contact in query) {
nicknames.Add (new NSString (contact.ScreenName));
}
// Return names
return new NSOrderedSet<NSString> (nicknames.AsSet ());
}
// This method MUST only be called on a background thread!
public void UpdateUserSpecificVocabulary ()
{
// Clear any existing vocabulary
INVocabulary.SharedVocabulary.RemoveAllVocabularyStrings ();
// Register new vocabulary
INVocabulary.SharedVocabulary.SetVocabularyStrings (ContactNicknames (), INVocabularyStringType.ContactName);
}
#endregion
}
}
Avec ce code en place, il peut être appelé comme suit :
using System;
using System.Threading;
using UIKit;
using MonkeyChatCommon;
using Intents;
namespace MonkeyChat
{
public partial class ViewController : UIViewController
{
#region AppDelegate Access
public AppDelegate ThisApp {
get { return (AppDelegate)UIApplication.SharedApplication.Delegate; }
}
#endregion
#region Constructors
protected ViewController (IntPtr handle) : base (handle)
{
// Note: this .ctor should not contain any initialization logic.
}
#endregion
#region Override Methods
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
// Do we have access to Siri?
if (INPreferences.SiriAuthorizationStatus == INSiriAuthorizationStatus.Authorized) {
// Yes, update Siri's vocabulary
new Thread (() => {
Thread.CurrentThread.IsBackground = true;
ThisApp.AddressBook.UpdateUserSpecificVocabulary ();
}).Start ();
}
}
public override void DidReceiveMemoryWarning ()
{
base.DidReceiveMemoryWarning ();
// Release any cached data, images, etc that aren't in use.
}
#endregion
}
}
Important
Siri traite le vocabulaire personnalisé comme des indicateurs et incorporera autant de terminologie que possible. Toutefois, l’espace pour le vocabulaire personnalisé est limité, ce qui signifie qu’il est important d’inscrire uniquement la terminologie susceptible d’être déroutante, en conservant au minimum le nombre total de termes inscrits.
Pour plus d’informations, consultez notre référence de vocabulaire spécifique à l’utilisateur et la référence de vocabulaire personnalisé d’Apple.
Ajout d’un vocabulaire spécifique à l’application
Le vocabulaire spécifique de l’application définit les mots et expressions spécifiques qui seront connus de tous les utilisateurs de l’application, tels que les types de véhicules ou les noms d’entraînement. Étant donné qu’elles font partie de l’application, elles sont définies dans un AppIntentVocabulary.plist
fichier dans le cadre du groupe d’applications principal. En outre, ces mots et expressions doivent être localisés.
Les termes de vocabulaire spécifiques à l’application doivent appartenir à l’une des catégories suivantes :
- Options de trajet.
- Noms d’entraînement.
Le fichier de vocabulaire spécifique à l’application contient deux clés de niveau racine :
ParameterVocabularies
Obligatoire : définit les termes personnalisés et les paramètres d’intention de l’application auxquels ils s’appliquent.IntentPhrases
Facultatif : contient des exemples d’expressions utilisant les termes personnalisés définis dans leParameterVocabularies
.
Chaque entrée du ParameterVocabularies
fichier doit spécifier une chaîne d’ID, un terme et l’intention auxquelles le terme s’applique. En outre, un seul terme peut s’appliquer à plusieurs intentions.
Pour obtenir la liste complète des valeurs acceptables et de la structure de fichiers requise, consultez la référence du format de fichier de vocabulaire d’application d’Apple.
Pour ajouter un AppIntentVocabulary.plist
fichier au projet d’application, procédez comme suit :
Cliquez avec le bouton droit sur le nom du projet dans le Explorateur de solutions, puis sélectionnez Ajouter>un nouveau fichier...>iOS :
Double-cliquez sur le
AppIntentVocabulary.plist
fichier dans le Explorateur de solutions pour l’ouvrir pour modification.Cliquez sur la + touche pour ajouter une clé, définissez le nom
ParameterVocabularies
et le type surArray
:Développez et cliquez sur le bouton et définissez
ParameterVocabularies
le type surDictionary
:+Cliquez sur la + touche pour ajouter une nouvelle clé, définissez le nom
ParameterNames
sur et le type surArray
:Cliquez sur la + touche pour ajouter une nouvelle clé avec le type et
String
la valeur comme l’un des noms de paramètres disponibles. Par exemple,INStartWorkoutIntent.workoutName
:Ajoutez la
ParameterVocabulary
clé à laParameterVocabularies
clé avec le type deArray
:Ajoutez une nouvelle clé avec le type de
Dictionary
:Ajoutez la
VocabularyItemIdentifier
clé avec le type etString
spécifiez un ID unique pour le terme :Ajoutez la
VocabularyItemSynonyms
clé avec le type deArray
:Ajoutez une nouvelle clé avec le type de
Dictionary
:Ajoutez la
VocabularyItemPhrase
clé avec le type deString
l’application et le terme défini par l’application :Ajoutez la
VocabularyItemPronunciation
clé avec le type etString
la prononciation phonétique du terme :Ajoutez la
VocabularyItemExamples
clé avec le type deArray
:Ajoutez quelques
String
clés avec des exemples d’utilisations du terme :Répétez les étapes ci-dessus pour tous les autres termes personnalisés que l’application doit définir.
Réduisez la
ParameterVocabularies
clé.Ajoutez la
IntentPhrases
clé avec le type deArray
:Ajoutez une nouvelle clé avec le type de
Dictionary
:Ajoutez la
IntentName
clé avec le type etString
l’intention pour l’exemple :Ajoutez la
IntentExamples
clé avec le type deArray
:Ajoutez quelques
String
clés avec des exemples d’utilisations du terme :Répétez les étapes ci-dessus pour toutes les intentions dont l’application a besoin pour fournir des exemples d’utilisation.
Important
L’inscription AppIntentVocabulary.plist
auprès de Siri sur les appareils de test pendant le développement peut prendre un certain temps pour que Siri incorpore le vocabulaire personnalisé. Par conséquent, le testeur doit attendre plusieurs minutes avant de tenter de tester le vocabulaire spécifique à l’application lorsqu’il a été mis à jour.
Pour plus d’informations, consultez notre référence de vocabulaire spécifique à l’application et les informations de référence sur la spécification de vocabulaire personnalisé d’Apple.
Ajout d’une extension intentions
Maintenant que l’application a été prête à adopter SiriKit, le développeur devra ajouter une (ou plusieurs) extensions d’intentions à la solution pour gérer les intentions requises pour l’intégration de Siri.
Pour chaque extension Intentions requise, procédez comme suit :
- Ajoutez un projet d’extension Intents à la solution d’application Xamarin.iOS.
- Configurez le fichier d’extension
Info.plist
Intents. - Modifiez la classe principale Intents Extension.
Pour plus d’informations, consultez notre référence sur l’extension Intentions et la référence sur la création de l’extension Intentions d’Apple.
Création de l’extension
Pour ajouter une extension Intents à la solution, procédez comme suit :
Cliquez avec le bouton droit sur le nom de la solution dans le panneau Solution, puis sélectionnez Ajouter>un nouveau projet....
Dans la boîte de dialogue, sélectionnez Extension d’intention des extensions>iOS>, puis cliquez sur le bouton Suivant :
Entrez ensuite un nom pour l’extension d’intention, puis cliquez sur le bouton Suivant :
Enfin, cliquez sur le bouton Créer pour ajouter l’extension d’intention à la solution d’applications :
Dans le Explorateur de solutions, cliquez avec le bouton droit sur le dossier Références de l’extension d’intention nouvellement créée. Vérifiez le nom du projet de bibliothèque de code partagé commun (que l’application a créée ci-dessus) et cliquez sur le bouton OK :
Répétez ces étapes pour le nombre d’extensions d’intention (en fonction de la section Architecture de l’application pour extensions ci-dessus) dont l’application aura besoin.
Configuration de Info.plist
Pour chacune des extensions Intents ajoutées à la solution de l’application, vous devez configurer les Info.plist
fichiers pour qu’elles fonctionnent avec l’application.
Tout comme n’importe quelle extension d’application classique, l’application aura les clés existantes de NSExtension
et NSExtensionAttributes
. Pour une extension Intents, il existe deux nouveaux attributs qui doivent être configurés :
- IntentsSupported : est requis et se compose d’un tableau de noms de classes d’intention que l’application souhaite prendre en charge à partir de l’extension d’intention.
- IntentsRestrictedWhileLocked : clé facultative pour l’application afin de spécifier le comportement de l’écran de verrouillage de l’extension. Il se compose d’un tableau de noms de classes d’intention que l’application souhaite que l’utilisateur puisse utiliser à partir de l’extension d’intention.
Pour configurer le fichier de l’extension Info.plist
d’intention, double-cliquez dessus dans le Explorateur de solutions pour l’ouvrir pour modification. Ensuite, basculez vers la vue Source, puis développez les clés et NSExtensionAttributes
les NSExtension
clés dans l’éditeur :
Développez la IntentsSupported
clé et ajoutez le nom de n’importe quelle classe d’intention prise en charge par cette extension. Pour l’exemple d’application MonkeyChat, elle prend en charge les INSendMessageIntent
points suivants :
Si l’application exige éventuellement que l’utilisateur soit connecté à l’appareil pour utiliser une intention donnée, développez la IntentRestrictedWhileLocked
clé et ajoutez les noms de classes des intentions qui ont un accès restreint. Pour l’exemple d’application MonkeyChat, l’utilisateur doit être connecté pour envoyer un message de conversation afin que nous ayons ajouté INSendMessageIntent
:
Pour obtenir la liste complète des domaines d’intention disponibles, consultez la référence des domaines d’intention d’Apple.
Configuration de la classe principale
Ensuite, le développeur devra configurer la classe principale qui joue le rôle de point d’entrée principal pour l’extension d’intention dans Siri. Il doit s’agir d’une sous-classe INExtension
dont la IINIntentHandler
conformité au délégué est conforme. Par exemple :
using System;
using System.Collections.Generic;
using Foundation;
using Intents;
namespace MonkeyChatIntents
{
[Register ("IntentHandler")]
public class IntentHandler : INExtension, IINSendMessageIntentHandling, IINSearchForMessagesIntentHandling, IINSetMessageAttributeIntentHandling
{
#region Constructors
protected IntentHandler (IntPtr handle) : base (handle)
{
// Note: this .ctor should not contain any initialization logic.
}
#endregion
#region Override Methods
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;
}
#endregion
...
}
}
Il existe une méthode solitaire que l’application doit implémenter sur la classe principale Intent Extension, la GetHandler
méthode. Cette méthode est passée à une intention par SiriKit et l’application doit retourner un gestionnaire d’intention qui correspond au type de l’intention donnée.
Étant donné que l’exemple d’application MonkeyChat ne gère qu’une seule intention, elle se retourne dans la GetHandler
méthode. Si l’extension a géré plusieurs intentions, le développeur ajoute une classe pour chaque type d’intention et retourne une instance ici en fonction de la Intent
méthode passée.
Gestion de l’étape de résolution
L’étape de résolution est l’emplacement où l’extension d’intention clarifiera et validera les paramètres transmis à partir de Siri et qui ont été définis par le biais de la conversation de l’utilisateur.
Pour chaque paramètre envoyé à partir de Siri, il existe une Resolve
méthode. L’application doit implémenter cette méthode pour chaque paramètre que l’application peut avoir besoin de l’aide de Siri pour obtenir la réponse correcte de l’utilisateur.
Dans le cas de l’exemple d’application MonkeyChat, l’extension d’intention nécessite un ou plusieurs destinataires pour envoyer le message. Pour chaque destinataire de la liste, l’extension doit effectuer une recherche de contact qui peut avoir les résultats suivants :
- Exactement un contact correspondant est trouvé.
- Deux contacts correspondants ou plus sont trouvés.
- Aucun contact correspondant n’est trouvé.
En outre, MonkeyChat nécessite du contenu pour le corps du message. Si l’utilisateur n’a pas fourni cette option, Siri doit inviter l’utilisateur à entrer le contenu.
L’extension d’intention doit gérer correctement chacun de ces cas.
[Export ("resolveRecipientsForSearchForMessages:withCompletion:")]
public void ResolveRecipients (INSendMessageIntent intent, Action<INPersonResolutionResult []> completion)
{
var recipients = intent.Recipients;
// If no recipients were provided we'll need to prompt for a value.
if (recipients.Length == 0) {
completion (new INPersonResolutionResult [] { (INPersonResolutionResult)INPersonResolutionResult.NeedsValue });
return;
}
var resolutionResults = new List<INPersonResolutionResult> ();
foreach (var recipient in recipients) {
var matchingContacts = new INPerson [] { recipient }; // Implement your contact matching logic here to create an array of matching contacts
if (matchingContacts.Length > 1) {
// We need Siri's help to ask user to pick one from the matches.
resolutionResults.Add (INPersonResolutionResult.GetDisambiguation (matchingContacts));
} else if (matchingContacts.Length == 1) {
// We have exactly one matching contact
resolutionResults.Add (INPersonResolutionResult.GetSuccess (recipient));
} else {
// We have no contacts matching the description provided
resolutionResults.Add ((INPersonResolutionResult)INPersonResolutionResult.Unsupported);
}
}
completion (resolutionResults.ToArray ());
}
[Export ("resolveContentForSendMessage:withCompletion:")]
public void ResolveContent (INSendMessageIntent intent, Action<INStringResolutionResult> completion)
{
var text = intent.Content;
if (!string.IsNullOrEmpty (text))
completion (INStringResolutionResult.GetSuccess (text));
else
completion ((INStringResolutionResult)INStringResolutionResult.NeedsValue);
}
Pour plus d’informations, consultez notre référence sur la phase de résolution et les informations de référence sur la résolution et la gestion des intentions d’Apple.
Gestion de l’étape de confirmation
L’étape de confirmation est l’emplacement où l’extension d’intention vérifie qu’elle contient toutes les informations pour répondre à la demande de l’utilisateur. L’application souhaite envoyer une confirmation avec tous les détails de prise en charge de ce qui est sur le point d’arriver à Siri afin qu’elle puisse être confirmée avec l’utilisateur qu’il s’agit de l’action prévue.
[Export ("confirmSendMessage:completion:")]
public void ConfirmSendMessage (INSendMessageIntent intent, Action<INSendMessageIntentResponse> completion)
{
// Verify user is authenticated and the app is ready to send a message.
...
var userActivity = new NSUserActivity (nameof (INSendMessageIntent));
var response = new INSendMessageIntentResponse (INSendMessageIntentResponseCode.Ready, userActivity);
completion (response);
}
Pour plus d’informations, consultez notre référence sur l’étape de confirmation.
Traitement de l’intention
Il s’agit du point où l’extension d’intention effectue réellement la tâche pour remplir la demande de l’utilisateur et transmettre les résultats à Siri afin que l’utilisateur puisse être informé.
public void HandleSendMessage (INSendMessageIntent intent, Action<INSendMessageIntentResponse> completion)
{
// Implement the application logic to send a message here.
...
var userActivity = new NSUserActivity (nameof (INSendMessageIntent));
var response = new INSendMessageIntentResponse (INSendMessageIntentResponseCode.Success, userActivity);
completion (response);
}
public void HandleSearchForMessages (INSearchForMessagesIntent intent, Action<INSearchForMessagesIntentResponse> completion)
{
// Implement the application logic to find a message that matches the information in the intent.
...
var userActivity = new NSUserActivity (nameof (INSearchForMessagesIntent));
var response = new INSearchForMessagesIntentResponse (INSearchForMessagesIntentResponseCode.Success, userActivity);
// Initialize with found message's attributes
var sender = new INPerson (new INPersonHandle ("sarah@example.com", INPersonHandleType.EmailAddress), null, "Sarah", null, null, null);
var recipient = new INPerson (new INPersonHandle ("+1-415-555-5555", INPersonHandleType.PhoneNumber), null, "John", null, null, null);
var message = new INMessage ("identifier", "I am so excited about SiriKit!", NSDate.Now, sender, new INPerson [] { recipient });
response.Messages = new INMessage [] { message };
completion (response);
}
public void HandleSetMessageAttribute (INSetMessageAttributeIntent intent, Action<INSetMessageAttributeIntentResponse> completion)
{
// Implement the application logic to set the message attribute here.
...
var userActivity = new NSUserActivity (nameof (INSetMessageAttributeIntent));
var response = new INSetMessageAttributeIntentResponse (INSetMessageAttributeIntentResponseCode.Success, userActivity);
completion (response);
}
Pour plus d’informations, consultez notre référence sur l’étape de gestion.
Ajout d’une extension d’interface utilisateur intents
L’extension d’interface utilisateur Intentions facultative présente l’opportunité de mettre l’interface utilisateur et la personnalisation de l’application dans l’expérience Siri et de rendre les utilisateurs connectés à l’application. Avec cette extension, l’application peut apporter la marque ainsi que des informations visuelles et d’autres informations dans la transcription.
Tout comme l’extension Intents, le développeur effectue l’étape suivante pour l’extension d’interface utilisateur intents :
- Ajoutez un projet d’extension d’interface utilisateur Intents à la solution d’application Xamarin.iOS.
- Configurez le fichier d’extension de l’interface
Info.plist
utilisateur Intents. - Modifiez la classe principale de l’extension d’interface utilisateur Intents.
Pour plus d’informations, consultez notre référence sur l’extension d’interface utilisateur Intentions et la référence d’Apple sur la fourniture d’une référence d’interface personnalisée.
Création de l’extension
Pour ajouter une extension d’interface utilisateur Intents à la solution, procédez comme suit :
Cliquez avec le bouton droit sur le nom de la solution dans le panneau Solution, puis sélectionnez Ajouter>un nouveau projet....
Dans la boîte de dialogue, sélectionnez Extension de l’interface utilisateur de l’intention des extensions>iOS>, puis cliquez sur le bouton Suivant :
Entrez ensuite un nom pour l’extension d’intention, puis cliquez sur le bouton Suivant :
Enfin, cliquez sur le bouton Créer pour ajouter l’extension d’intention à la solution d’applications :
Dans le Explorateur de solutions, cliquez avec le bouton droit sur le dossier Références de l’extension d’intention nouvellement créée. Vérifiez le nom du projet de bibliothèque de code partagé commun (que l’application a créée ci-dessus) et cliquez sur le bouton OK :
Configuration de Info.plist
Configurez le fichier de Info.plist
l’extension d’interface utilisateur Intents pour qu’il fonctionne avec l’application.
Tout comme n’importe quelle extension d’application classique, l’application aura les clés existantes de NSExtension
et NSExtensionAttributes
. Pour une extension Intents, il existe un nouvel attribut qui doit être configuré :
IntentsSupported est requis et se compose d’un tableau de noms de classes d’intention que l’application souhaite prendre en charge à partir de l’extension d’intention.
Pour configurer le fichier de Info.plist
l’extension d’interface utilisateur d’intention, double-cliquez dessus dans le Explorateur de solutions pour l’ouvrir pour modification. Ensuite, basculez vers la vue Source, puis développez les clés et NSExtensionAttributes
les NSExtension
clés dans l’éditeur :
Développez la IntentsSupported
clé et ajoutez le nom de n’importe quelle classe d’intention prise en charge par cette extension. Pour l’exemple d’application MonkeyChat, elle prend en charge les INSendMessageIntent
points suivants :
Pour obtenir la liste complète des domaines d’intention disponibles, consultez la référence des domaines d’intention d’Apple.
Configuration de la classe principale
Configurez la classe principale qui joue le rôle de point d’entrée principal pour l’extension d’interface utilisateur intention dans Siri. Il doit s’agir d’une sous-classe dont UIViewController
la conformité est conforme à l’interface IINUIHostedViewController
. Par exemple :
using System;
using Foundation;
using CoreGraphics;
using Intents;
using IntentsUI;
using UIKit;
namespace MonkeyChatIntentsUI
{
public partial class IntentViewController : UIViewController, IINUIHostedViewControlling
{
#region Constructors
protected IntentViewController (IntPtr handle) : base (handle)
{
// Note: this .ctor should not contain any initialization logic.
}
#endregion
#region Override Methods
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
// Do any required interface initialization here.
}
public override void DidReceiveMemoryWarning ()
{
// Releases the view if it doesn't have a superview.
base.DidReceiveMemoryWarning ();
// Release any cached data, images, etc that aren't in use.
}
#endregion
#region Public Methods
[Export ("configureWithInteraction:context:completion:")]
public void Configure (INInteraction interaction, INUIHostedViewContext context, Action<CGSize> completion)
{
// Do configuration here, including preparing views and calculating a desired size for presentation.
if (completion != null)
completion (DesiredSize ());
}
[Export ("desiredSize:")]
public CGSize DesiredSize ()
{
return ExtensionContext.GetHostedViewMaximumAllowedSize ();
}
#endregion
}
}
Siri transmet une INInteraction
instance de classe à la Configure
méthode de l’instance à l’intérieur UIViewController
de l’extension d’interface utilisateur intention.
L’objet INInteraction
fournit trois éléments clés d’informations à l’extension :
- Objet Intent en cours de traitement.
- Objet Intent Response à partir des méthodes et
Handle
de l’extensionConfirm
d’intention. - État d’interaction qui définit l’état de l’interaction entre l’application et Siri.
L’instance UIViewController
est la classe de principe pour l’interaction avec Siri et, parce qu’elle hérite de UIViewController
, elle a accès à toutes les fonctionnalités de UIKit.
Lorsque Siri appelle la Configure
méthode de celle-ci UIViewController
, elle passe dans un contexte d’affichage indiquant que le contrôleur de vue sera hébergé dans une carte Siri Snippit ou Cartes.
Siri transmet également un gestionnaire d’achèvement que l’application doit retourner la taille souhaitée de l’affichage une fois l’application terminée sa configuration.
Concevoir l’interface utilisateur dans le Concepteur iOS
Disposition de l’interface utilisateur de l’extension d’interface utilisateur intents dans le concepteur iOS. Double-cliquez sur le fichier de MainInterface.storyboard
l’extension dans le Explorateur de solutions pour l’ouvrir pour modification. Faites glisser tous les éléments d’interface utilisateur requis pour générer l’interface utilisateur et enregistrer les modifications.
Important
Bien qu’il soit possible d’ajouter des éléments interactifs tels que UIButtons
ou UITextFields
à l’extension d’interface utilisateur d’intention UIViewController
, ceux-ci sont strictement interdits en tant qu’interface utilisateur intention dans une interface utilisateur non interactive et l’utilisateur ne pourra pas interagir avec eux.
Connecter l’interface utilisateur
Avec l’interface utilisateur de l’extension Intents UI créée dans le Concepteur iOS, modifiez la UIViewController
sous-classe et remplacez la Configure
méthode comme suit :
[Export ("configureWithInteraction:context:completion:")]
public void Configure (INInteraction interaction, INUIHostedViewContext context, Action<CGSize> completion)
{
// Do configuration here, including preparing views and calculating a desired size for presentation.
...
// Return desired size
if (completion != null)
completion (DesiredSize ());
}
[Export ("desiredSize:")]
public CGSize DesiredSize ()
{
return ExtensionContext.GetHostedViewMaximumAllowedSize ();
}
Substitution de l’interface utilisateur Siri par défaut
L’extension d’interface utilisateur Intentions s’affiche toujours avec d’autres contenus Siri tels que l’icône d’application et le nom en haut de l’interface utilisateur ou, en fonction de l’intention, des boutons (comme Envoyer ou Annuler) peuvent s’afficher en bas.
Il existe quelques instances où l’application peut remplacer les informations affichées par Siri à l’utilisateur par défaut, telles que la messagerie ou les mappages où l’application peut remplacer l’expérience par défaut par un utilisateur adapté à l’application.
Si l’extension intentions de l’interface utilisateur doit remplacer les éléments de l’interface utilisateur Siri par défaut, la UIViewController
sous-classe doit implémenter l’interface IINUIHostedViewSiriProviding
et choisir d’afficher un élément d’interface particulier.
Ajoutez le code suivant à la UIViewController
sous-classe pour indiquer à Siri que l’extension d’interface utilisateur intention affiche déjà le contenu du message :
public bool DisplaysMessage {
get {return true;}
}
À propos de l’installation
Apple suggère que le développeur prenne en compte les considérations suivantes lors de la conception et de l’implémentation des extensions de l’interface utilisateur intention :
- Être conscient de l’utilisation de la mémoire : étant donné que les extensions de l’interface utilisateur d’intention sont temporaires et affichées seulement pendant une courte période, le système impose des contraintes de mémoire plus strictes que celles utilisées avec une application complète.
- Tenez compte des tailles minimales et maximales d’affichage : vérifiez que les extensions de l’interface utilisateur de l’intention sont correctes sur chaque type d’appareil iOS, taille et orientation. En outre, la taille souhaitée que l’application renvoie à Siri peut ne pas être en mesure d’accorder.
- Utilisez à nouveau des modèles de disposition flexibles et adaptatifs pour vous assurer que l’interface utilisateur est idéale sur chaque appareil.
Résumé
Cet article a abordé SiriKit et montré comment il peut être ajouté aux applications Xamarin.iOS pour fournir des services accessibles à l’utilisateur à l’aide de Siri et de l’application Maps sur un appareil iOS.