Sirikit par Julien Coudsi

301 vues

Publié le

Sirikit par Julien Coudsi

Publié dans : Mobile
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

Sirikit par Julien Coudsi

  1. 1. SIRIKIT COCOAHEADS - MONTPELLIER – 17 NOVEMBRE 2016
  2. 2. AU SOMMAIRE… • Quoi de neuf ? • Traiter une demande • Ajouter du vocabulaire • Personnaliser l’affichage • Démo 28.11.16 BACKELITE 2
  3. 3. QUOI DE NEUF ?
  4. 4. 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
  5. 5. TRAITER UNE DEMANDE
  6. 6. 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
  7. 7. 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
  8. 8. INTENTS ET DOMAINES A chaque domaine sa liste d’intents : • Messages o INSendMessageIntent o INSearchForMessagesIntent o INSetMessagesAttributes • Paiements o INSendPaymentIntent o INRequestPaymentIntent etc …
  9. 9. 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
  10. 10. 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 } } }
  11. 11. 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])]) } }
  12. 12. 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)) }
  13. 13. 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)) }
  14. 14. AJOUTER DU VOCABULAIRE
  15. 15. 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
  16. 16. 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)
  17. 17. APPINTENTVOCABULARY.PLIST 28.11.16 BACKELITE 17
  18. 18. PERSONNALISER L’AFFICHAGE
  19. 19. 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
  20. 20. CONFIGURATION DU PROJET 28.11.16 BACKELITE 20 • Info.plist de l’extension • Ajout du storyboard et d’un unique ViewController associé
  21. 21. 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 }
  22. 22. DEMO
  23. 23. julien.coudsi@backelite.com www.backelite.com CONTACTEZ-NOUS COUDSI Julien Développeur iOS 28.11.16 BACKELITE 23

×