sirikit par julien coudsi
TRANSCRIPT
SIRIKIT
COCOAHEADS - MONTPELLIER – 17 NOVEMBRE 2016
AU SOMMAIRE…
• Quoi de neuf ?
• Traiter une demande
• Ajouter du vocabulaire
• Personnaliser l’affichage
• Démo
28.11.16 BACKELITE 2
QUOI DE NEUF ?
QUOI DE NEUF AVEC SIRIKIT ?
28.11.16 BACKELITE 4
• A partir d’iOS 10, Siri s’ouvre aux applications tierces
• Domaines disponibles : Réservation de véhicule
Messages
Photos
Paiements
Communication audio et vidéo
Fitness
Restaurants (avec Plans)
Carplay
TRAITER UNE DEMANDE
PRE-REQUIS
28.11.16 BACKELITE 6
• Une application iOS existante
• Implémenter le code de l’application utilisé par Siri dans un framework
• Utiliser un conteneur partagé pour les ressources communes
• iOS 10 / Xcode 8
COMMENT CA MARCHE ?
28.11.16 BACKELITE 7
• Utilisation d’une Intents Extension
• Un « intent » correspond à une demande de l’utilisateur
INExtension
Intent handler B 1 - Resolve
« Envoi un message »
2 - Confirm
3 - Handle
Action
INIntentResponse
INIntent
Intent handler A
INTENTS ET DOMAINES
A chaque domaine sa liste d’intents :
• Messageso INSendMessageIntent
o INSearchForMessagesIntent
o INSetMessagesAttributes
• Paiementso INSendPaymentIntent
o INRequestPaymentIntent
etc …
CONFIGURATION DU PROJET
28.11.16 BACKELITE 9
• Info.plist de l’extension
• Autoriser l’application à utiliser Siri• Capability Siri activée• App id supportant SiriKit
• Info.plist de l’application
INEXTENSION
28.11.16 BACKELITE 10
• Point d’entrée de l’extension
• Appelle le bon intent handler
class IntentExtension: INExtension {
override func handler(for intent: INIntent) -> Any? {
if intent is INSendMessageIntent {
return MessagesIntentHandler()
} else if intent is INStartAudioCallIntent {
return AudioCallIntentHandler()
} else {
return nil
}
}
}
INTENT HANDLER - RESOLVE
28.11.16 BACKELITE 11
• Vérification des paramètres de l’intent
• Peut solliciter l’utilisateur pour des précisions
func resolveRecipients(forSendMessage intent: INSendMessageIntent, with completion: @escaping ([INPersonResolutionResult]) -> Void)
{
guard let recipients = intent.recipients else {
return
}
if recipients.count == 0 {
completion([INPersonResolutionResult.needsValue()])
} else {
completion([INPersonResolutionResult.success(with: recipients[0])])
}
}
INTENT HANDLER - CONFIRM
28.11.16 BACKELITE 12
• Validation finale de l’intent avant son traitement
• Sollicite l’utilisateur dans certains cas :• Demandes irréversibles
• Transactions financières
func confirm(sendMessage intent: INSendMessageIntent, completion: @escaping (INSendMessageIntentResponse) -> Void) {
completion(INSendMessageIntentResponse(code: .ready, userActivity: nil))
}
INTENT HANDLER - HANDLE
28.11.16 BACKELITE 13
• Réalise la tâche associée à l’intent
• Renvoie une réponse
func handle(sendMessage intent: INSendMessageIntent, completion: @escaping (INSendMessageIntentResponse) -> Void) {
var success = false
if let recipients = intent.recipients {
success = ContactsManager.sharedManager.sendMessage(to: recipients)
}
completion(INSendMessageIntentResponse(code: success ? .success : .failure, userActivity: nil))
}
AJOUTER DU VOCABULAIRE
VOCABULAIRE SPECIFIQUE A UN UTILISATEUR
28.11.16 BACKELITE 15
• Restreint aux catégories suivantes : Noms de contacts
Groupes de contact
Tags de photo
Noms d’albums photos
Noms d’exercices (fitness)
Profils de voiture (CarPlay)
DispatchQueue(label: "SiriVocabulary").async {
let contactNicknames:NSOrderedSet = ["JeanMi", "Zozor", "Blop", "Toto"]
INVocabulary.shared().setVocabularyStrings(contactNicknames, of: .contactName)
}
• Utilise l’API INVocabulary depuis l’application
VOCABULAIRE COMMUN A TOUS LES UTILISATEURS
28.11.16 BACKELITE 16
• Utilise le fichier AppIntentVocabulary.plist
• Restreint aux catégories suivantes : Options de réservation d’un véhicule
Noms d’exercices (fitness)
APPINTENTVOCABULARY.PLIST
28.11.16 BACKELITE 17
PERSONNALISER L’AFFICHAGE
PRINCIPE
28.11.16 BACKELITE 19
• Enrichir l’interface lors des échanges avec l’utilisateur
• Utilisation d’une Intents UI Extension
• Restreint aux domaines suivants Messages
Paiements
Réservation de véhicule
Fitness
CONFIGURATION DU PROJET
28.11.16 BACKELITE 20
• Info.plist de l’extension
• Ajout du storyboard et d’un unique ViewController associé
CONFIGURATION DU VIEW CONTROLLER
28.11.16 BACKELITE 21
• Implémentation du protocole INUIHostedViewControlling
func configure(with interaction: INInteraction!, context: INUIHostedViewContext, completion: ((CGSize) -> Void)!) {
...
if let completion = completion {
completion(self.extensionContext!.hostedViewMaximumAllowedSize)
}
}
• Implémentation du protocole INUIHostedViewSiriProviding pour masquer la vue par défaut dans Siri
var displaysMessage: Bool {
return true
}
DEMO
www.backelite.com
CONTACTEZ-NOUSCOUDSI Julien
Développeur iOS
28.11.16 BACKELITE 23