SlideShare a Scribd company logo
1 of 24
Download to read offline
MESSAGE EXTENSIONS
COCOAHEADS MONTPELLIER - SESSION OCTOBRE 2016
Swift Nicolas Fontaine
2
Introduction
Les applis/extensions iMessage sont une nouveauté iOS10
Elles viennent s’ajouter directement dans l’application message du iDevice et
permettent tout un tas de choses. Sky is the limit !
Chose nouvelle de la part d’apple, elles peuvent être indépendantes ! Elles
peuvent donc être utilisées comme les today extensions ou être des
applications entières à elles seules.
Parmis ces extensions il y a un type particulier nommé : « sticker pack
application ». Nous ne les verrons que très succinctement puisqu’un enfant de 4
ans pourrait un faire une en 3min montre en main.
QUELQUES EXEMPLES :
3
Game pigeon (oui ça s’appelle vraiment comme ça)
Un set de jeux iMessage qui
rappelle un peu l’époque de MSN
Messenger avec ses jeux intégrés.
QUELQUES EXEMPLES :
4
Do with me : la todolist collaborative
On prend les mêmes et on
recommence, voici une Nème
application « todolist » mais cette
fois-ci entièrement intégrée à
iMessage et donc collaborative !
5
SUPER MARIO RUN Stickers : Une pub idéale
Simplissime à produire, facile à
« vendre », les stickers app sont
une véritable mine d’or.
La plupart se vendent à 0,99€.
Les autres, gratuites, servent de
publicité à une autre application
(possiblement payante) comme
Mario Run ici.
QUELQUES EXEMPLES :
1 - CRÉER SON EXTENSION MESSAGE
7
Créer une sticker pack application
Nouveau projet -> Stickers pack application
Après c’est UNIQUEMENT du drag&drop
8
Créer son application Message
Pour ajouter une extension Message à une application, il faut simplement le
faire depuis l’écran d’ajout d’une target. L’une des options disponible sera
« Message Extension ».
Cela créé tous les fichiers nécessaires à l’initialisation de votre extension :
• Un storyboard
• Un images.assets
• Un info.plist
• Un viewController héritant de : MSMessagesAppViewController
• Ce view controller DOIT rester le point d’entrée de votre storyboard
2 - ARCHITECTURER SON EXTENSION MESSAGE
Recommandations
10
Architecturer son extension Message
Le MSMessagesAppViewController sera la clé de voute de l’application.
Pour une application de cette taille, on pourra se permettre de lui confier le
gros du boulot. Cependant il est sûrement possible de factoriser, ou utiliser des
delegate pour ne pas l’encombrer.
Pourquoi est-il important :
• Il est le seul à avoir accès à l’objet : activeConversation
• Il possède des méthodes lifecycle/delegate essentielles
• Il peut demander l’affichage au format compact ou étendu
11
Conversation
MSMessagesApp
ViewController
ViewController 1
ViewController 3
ViewController 2
Child
Delegate
Créer / Utilise les messages
Gère la conversation et les
interactions utilisateur avec la
conversation
Architecturer son extension Message
12
override func willTransition(to presentationStyle: MSMessagesAppPresentationStyle)
override func willBecomeActive(with conversation: MSConversation)
Une gestion du lifeCycle inhabituelle
Deux style de présentation :
requestPresentationStyle(MSMessagesAppPresentationStyle.compact)
requestPresentationStyle(MSMessagesAppPresentationStyle.expanded)
Architecturer son extension Message
13
Passer des données dans un message
Model de
données
• var1
• var2
• var3
?var1=xxx&var2=xxx&var3=xxx
toUrl()
URL (NSURL en obj-c)
Architecturer son extension Message
3 - ENVOYER DES MESSAGES, GÉRER UNE SESSION
15
Créer un message, faire passer des données et gérer son aspect
let newMessage:MSMessage = MSMessage(session : MSSession())
let newMessageLayout:MSMessageTemplateLayout = MSMessageTemplateLayout.init()
newMessageLayout.caption = "Depuis compte : (transactionOutAccount)"
newMessage.url = URL.init(string: transactionToSend.toUrl())
newMessageLayout.image = createImageForTransaction(message: "Proposition de
virement",amount: transactionToSend.amount)
newMessage.layout = newMessageLayout
16
Générer une image dynamiquement pour remplir son message
UIGraphicsBeginImageContextWithOptions(toImageView.frame.size, false, UIScreen.main.scale)
toImageView.drawHierarchy(in: toImageView.bounds, afterScreenUpdates: true)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
Une solution simple est de créer un contenu complet avec des views avant
d’utiliser le code suivant :
17
Envoyer un message
activeConversation.insert(currentMessage, completionHandler: nil)
override func didStartSending(_ message: MSMessage, conversation: MSConversation) {
// Quand l’utilisateur appuie sur le bouton d’envoi
}
override func didCancelSending(_ message: MSMessage, conversation: MSConversation)
{
// Quand l’utilisateur supprime un message créé précédemment sans l’envoyer
}
Mais cela ne nous permet pas d’envoyer directement le message, l’utilisateur doit
compléter (s’il le veut) et envoyer par la suite.
Heureusement, nous avons de jolis méthodes delegate !
18
Récupérer un(e) message/session
Pour que l’échange soit user-friendly, nous allons devoir réutiliser la même session
pour que l’utilisateur ai l’impression de faire passer un même message.
guard let activeConversation = activeConversation,
let selectedMessage = activeConversation.selectedMessage,
let session = selectedMessage.session else {
return
}
Là, je me suis assuré de la présence d’une conversation, d’un message sélectionné et de
la session à laquelle il appartient. Je vais pouvoir m’en servir pour :
let replyMessage = MSMessage(session: session)
let currentTransaction = TransactionModel.init(argumentUrl: selectedMessage.url)
• Utiliser le contenu du message sélectionné :
• Créer une réponse :
19
Identifier un message
Les messages sont « signés » à l’aide d’un UDID propre à un utilisateur dans la
conversation en cours.
let senderId = selectedMessage.senderParticipantIdentifier.uuidString
let myId = conversation.localParticipantIdentifier.uuidString
if (senderId == myId){
controller = instanciateMessageViewController(withMessage: "C'est pas ton tour Jean Michel !")
}
open var remoteParticipantIdentifiers: [UUID] { get }
Pour connaître tous les participants à la conversation, MSConversation contient :
20
Pour aller plus loin avec le MSMessagesAppViewController
Life cycle :
open func willBecomeActive(with conversation: MSConversation)
open func didBecomeActive(with conversation: MSConversation)
open func willResignActive(with conversation: MSConversation)
open func didResignActive(with conversation: MSConversation)
open func willSelect(_ message: MSMessage, conversation: MSConversation)
open func didSelect(_ message: MSMessage, conversation: MSConversation)
open func didReceive(_ message: MSMessage, conversation: MSConversation)
open func didStartSending(_ message: MSMessage, conversation: MSConversation)
open func didCancelSending(_ message: MSMessage, conversation: MSConversation)
open func willTransition(to presentationStyle: MSMessagesAppPresentationStyle)
open func didTransition(to presentationStyle: MSMessagesAppPresentationStyle)
Autres :
open func requestPresentationStyle(_ presentationStyle: MSMessagesAppPresentationStyle)
open func dismiss()
21
Pour aller plus loin avec les MSMessage
// Si ce booléen est vrai, le message s’effacera peu après la lecture de l’interlocuteur
open var shouldExpire: Bool
// Celui qu’on ne remplis jamais alors que ça ferrait de nous des gens sympa
open var accessibilityLabel: String?
// Un récapitulatif du contenu du message pour ce qui ne le voient pas tel quel (ex : vielle version d’iOS)
open var summaryText: String?
// Si le message n’a pas été envoyé, la raison de trouve ici
open var error: Error?
22
Aller plus loin avec MSConversation
func didChooseRIBSend() {
let urlpath = Bundle.main.path(forResource: "sample", ofType: "pdf")
let url:URL = URL(fileURLWithPath: urlpath!)
activeConversation?.insertAttachment(url, withAlternateFilename: "RIB de Jean-Michel POC",
completionHandler: nil)
activeConversation?.insertText("Voici mon RIB", completionHandler: nil)
}
4 - DÉMO / PRÉSENTATION DU CODE
SupaBank et son extension Message pour générer un virement
entre deux de ses clients
MERCI POUR VOTRE ATTENTION !
AVEZ-VOUS DES QUESTIONS ?
Contact : fontaine.nicolas34@gmail.com

More Related Content

Viewers also liked

Cocoaheads Montpellier Meetup : Comment gérer son onboarding
Cocoaheads Montpellier Meetup : Comment gérer son onboardingCocoaheads Montpellier Meetup : Comment gérer son onboarding
Cocoaheads Montpellier Meetup : Comment gérer son onboardingIdean France
 
Cocoaheads Montpellier Meetup : 3D Touch for iOS
Cocoaheads Montpellier Meetup : 3D Touch for iOSCocoaheads Montpellier Meetup : 3D Touch for iOS
Cocoaheads Montpellier Meetup : 3D Touch for iOSIdean France
 
Opérer un unbundling : 6 questions que les marques doivent se poser
Opérer un unbundling : 6 questions que les marques doivent se poserOpérer un unbundling : 6 questions que les marques doivent se poser
Opérer un unbundling : 6 questions que les marques doivent se poserIdean France
 
Meetup CocoaHeads Montpellier : conférence sur l'Auto Layout
Meetup CocoaHeads Montpellier : conférence sur l'Auto LayoutMeetup CocoaHeads Montpellier : conférence sur l'Auto Layout
Meetup CocoaHeads Montpellier : conférence sur l'Auto LayoutIdean France
 
CA Layer / Core Animation {Cocoaheads Montpellier}
CA Layer / Core Animation {Cocoaheads Montpellier}CA Layer / Core Animation {Cocoaheads Montpellier}
CA Layer / Core Animation {Cocoaheads Montpellier}Idean France
 
Programmation Orientée Protocole {Cocoaheads Montpellier}
Programmation Orientée Protocole {Cocoaheads Montpellier}Programmation Orientée Protocole {Cocoaheads Montpellier}
Programmation Orientée Protocole {Cocoaheads Montpellier}Idean France
 
Cocoaheads Montpellier Meetup : L'analyse de Code Statique avec Objective-C /...
Cocoaheads Montpellier Meetup : L'analyse de Code Statique avec Objective-C /...Cocoaheads Montpellier Meetup : L'analyse de Code Statique avec Objective-C /...
Cocoaheads Montpellier Meetup : L'analyse de Code Statique avec Objective-C /...Idean France
 
Un développeur sachant designer par Audrey Hacq
Un développeur sachant designer par Audrey HacqUn développeur sachant designer par Audrey Hacq
Un développeur sachant designer par Audrey HacqIdean France
 
Rendering unit tests par Nicolas Fontaine
Rendering unit tests par Nicolas FontaineRendering unit tests par Nicolas Fontaine
Rendering unit tests par Nicolas FontaineIdean France
 
Les Formulaires - Les bonnes pratiques pour une meilleure expérience utilisat...
Les Formulaires - Les bonnes pratiques pour une meilleure expérience utilisat...Les Formulaires - Les bonnes pratiques pour une meilleure expérience utilisat...
Les Formulaires - Les bonnes pratiques pour une meilleure expérience utilisat...Idean France
 
Les 10 Tendances du Design d'interface en 2016
Les 10 Tendances du Design d'interface en 2016Les 10 Tendances du Design d'interface en 2016
Les 10 Tendances du Design d'interface en 2016Idean France
 
Les 5 Tendances de la Performance Digitale en 2016
Les 5 Tendances de la Performance Digitale en 2016Les 5 Tendances de la Performance Digitale en 2016
Les 5 Tendances de la Performance Digitale en 2016Idean France
 
Les 9 Tendances Tech en 2016
Les 9 Tendances Tech en 2016Les 9 Tendances Tech en 2016
Les 9 Tendances Tech en 2016Idean France
 
Les 10 tendances de la User Experience en 2015
Les 10 tendances de la User Experience en 2015Les 10 tendances de la User Experience en 2015
Les 10 tendances de la User Experience en 2015Idean France
 
Les bonnes pratiques du e-commerce
Les bonnes pratiques du e-commerceLes bonnes pratiques du e-commerce
Les bonnes pratiques du e-commerceUX REPUBLIC
 
Les 10 Tendances de l’Expérience Utilisateur en 2016
Les 10 Tendances de l’Expérience Utilisateur en 2016Les 10 Tendances de l’Expérience Utilisateur en 2016
Les 10 Tendances de l’Expérience Utilisateur en 2016Idean France
 
Tendances du Design d'Interface 2017
Tendances du Design d'Interface 2017Tendances du Design d'Interface 2017
Tendances du Design d'Interface 2017Idean France
 
L'Apple Watch crée l'événement et bouscule le marché des smartwatches
L'Apple Watch crée l'événement et bouscule le marché des smartwatches  L'Apple Watch crée l'événement et bouscule le marché des smartwatches
L'Apple Watch crée l'événement et bouscule le marché des smartwatches Idean France
 
10 user experience trends in 2015
10 user experience trends in 201510 user experience trends in 2015
10 user experience trends in 2015Idean France
 
A developer who knows how to design by Audrey Hacq
A developer who knows how to design by Audrey HacqA developer who knows how to design by Audrey Hacq
A developer who knows how to design by Audrey HacqIdean France
 

Viewers also liked (20)

Cocoaheads Montpellier Meetup : Comment gérer son onboarding
Cocoaheads Montpellier Meetup : Comment gérer son onboardingCocoaheads Montpellier Meetup : Comment gérer son onboarding
Cocoaheads Montpellier Meetup : Comment gérer son onboarding
 
Cocoaheads Montpellier Meetup : 3D Touch for iOS
Cocoaheads Montpellier Meetup : 3D Touch for iOSCocoaheads Montpellier Meetup : 3D Touch for iOS
Cocoaheads Montpellier Meetup : 3D Touch for iOS
 
Opérer un unbundling : 6 questions que les marques doivent se poser
Opérer un unbundling : 6 questions que les marques doivent se poserOpérer un unbundling : 6 questions que les marques doivent se poser
Opérer un unbundling : 6 questions que les marques doivent se poser
 
Meetup CocoaHeads Montpellier : conférence sur l'Auto Layout
Meetup CocoaHeads Montpellier : conférence sur l'Auto LayoutMeetup CocoaHeads Montpellier : conférence sur l'Auto Layout
Meetup CocoaHeads Montpellier : conférence sur l'Auto Layout
 
CA Layer / Core Animation {Cocoaheads Montpellier}
CA Layer / Core Animation {Cocoaheads Montpellier}CA Layer / Core Animation {Cocoaheads Montpellier}
CA Layer / Core Animation {Cocoaheads Montpellier}
 
Programmation Orientée Protocole {Cocoaheads Montpellier}
Programmation Orientée Protocole {Cocoaheads Montpellier}Programmation Orientée Protocole {Cocoaheads Montpellier}
Programmation Orientée Protocole {Cocoaheads Montpellier}
 
Cocoaheads Montpellier Meetup : L'analyse de Code Statique avec Objective-C /...
Cocoaheads Montpellier Meetup : L'analyse de Code Statique avec Objective-C /...Cocoaheads Montpellier Meetup : L'analyse de Code Statique avec Objective-C /...
Cocoaheads Montpellier Meetup : L'analyse de Code Statique avec Objective-C /...
 
Un développeur sachant designer par Audrey Hacq
Un développeur sachant designer par Audrey HacqUn développeur sachant designer par Audrey Hacq
Un développeur sachant designer par Audrey Hacq
 
Rendering unit tests par Nicolas Fontaine
Rendering unit tests par Nicolas FontaineRendering unit tests par Nicolas Fontaine
Rendering unit tests par Nicolas Fontaine
 
Les Formulaires - Les bonnes pratiques pour une meilleure expérience utilisat...
Les Formulaires - Les bonnes pratiques pour une meilleure expérience utilisat...Les Formulaires - Les bonnes pratiques pour une meilleure expérience utilisat...
Les Formulaires - Les bonnes pratiques pour une meilleure expérience utilisat...
 
Les 10 Tendances du Design d'interface en 2016
Les 10 Tendances du Design d'interface en 2016Les 10 Tendances du Design d'interface en 2016
Les 10 Tendances du Design d'interface en 2016
 
Les 5 Tendances de la Performance Digitale en 2016
Les 5 Tendances de la Performance Digitale en 2016Les 5 Tendances de la Performance Digitale en 2016
Les 5 Tendances de la Performance Digitale en 2016
 
Les 9 Tendances Tech en 2016
Les 9 Tendances Tech en 2016Les 9 Tendances Tech en 2016
Les 9 Tendances Tech en 2016
 
Les 10 tendances de la User Experience en 2015
Les 10 tendances de la User Experience en 2015Les 10 tendances de la User Experience en 2015
Les 10 tendances de la User Experience en 2015
 
Les bonnes pratiques du e-commerce
Les bonnes pratiques du e-commerceLes bonnes pratiques du e-commerce
Les bonnes pratiques du e-commerce
 
Les 10 Tendances de l’Expérience Utilisateur en 2016
Les 10 Tendances de l’Expérience Utilisateur en 2016Les 10 Tendances de l’Expérience Utilisateur en 2016
Les 10 Tendances de l’Expérience Utilisateur en 2016
 
Tendances du Design d'Interface 2017
Tendances du Design d'Interface 2017Tendances du Design d'Interface 2017
Tendances du Design d'Interface 2017
 
L'Apple Watch crée l'événement et bouscule le marché des smartwatches
L'Apple Watch crée l'événement et bouscule le marché des smartwatches  L'Apple Watch crée l'événement et bouscule le marché des smartwatches
L'Apple Watch crée l'événement et bouscule le marché des smartwatches
 
10 user experience trends in 2015
10 user experience trends in 201510 user experience trends in 2015
10 user experience trends in 2015
 
A developer who knows how to design by Audrey Hacq
A developer who knows how to design by Audrey HacqA developer who knows how to design by Audrey Hacq
A developer who knows how to design by Audrey Hacq
 

Similar to Messages Extensions par Nicolas Fontaine

Les vues (views) sous android
Les vues (views) sous androidLes vues (views) sous android
Les vues (views) sous androidHoussem Lahiani
 
Les ateliers android_1_vers2015
Les ateliers android_1_vers2015Les ateliers android_1_vers2015
Les ateliers android_1_vers2015Saber LAJILI
 
Les ateliers android_1_vers2015
Les ateliers android_1_vers2015Les ateliers android_1_vers2015
Les ateliers android_1_vers2015Sabeur LAJILI
 
Les ateliers android_1_vers2015
Les ateliers android_1_vers2015Les ateliers android_1_vers2015
Les ateliers android_1_vers2015Sabeur LAJILI
 
Mobiliteatime #2 - WatchKit, le framework de développement pour l’Apple Watch
Mobiliteatime #2 - WatchKit, le framework de développement pour l’Apple WatchMobiliteatime #2 - WatchKit, le framework de développement pour l’Apple Watch
Mobiliteatime #2 - WatchKit, le framework de développement pour l’Apple WatchUSERADGENTS
 
Formation iPhone ENSI by (Orange Tunisie)
Formation iPhone ENSI by (Orange Tunisie)Formation iPhone ENSI by (Orange Tunisie)
Formation iPhone ENSI by (Orange Tunisie)Farouk Mezghich
 
Apple Watch par Benoit Capallere et Joeffrey Bocquet
Apple Watch par Benoit Capallere et Joeffrey BocquetApple Watch par Benoit Capallere et Joeffrey Bocquet
Apple Watch par Benoit Capallere et Joeffrey BocquetCocoaHeads France
 
Cycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'AndroidCycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'AndroidHoussem Lahiani
 
Cycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'AndroidCycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'AndroidHoussem Lahiani
 
Visual studio 2017 Launch keynote - Afterworks@Noumea
Visual studio 2017 Launch keynote - Afterworks@NoumeaVisual studio 2017 Launch keynote - Afterworks@Noumea
Visual studio 2017 Launch keynote - Afterworks@NoumeaJulien Chable
 
Niji_Rapport prévention_2023.pptx
Niji_Rapport prévention_2023.pptxNiji_Rapport prévention_2023.pptx
Niji_Rapport prévention_2023.pptxGabriel DUPONT
 
Mise en place de l'ActionBarCompat dans vos projets Android.
Mise en place de l'ActionBarCompat dans vos projets Android.Mise en place de l'ActionBarCompat dans vos projets Android.
Mise en place de l'ActionBarCompat dans vos projets Android.Mathias Seguy
 
Cours JavaScript.ppt
Cours JavaScript.pptCours JavaScript.ppt
Cours JavaScript.pptPROFPROF11
 
Publier une application mobile en un clic
Publier une application mobile en un clicPublier une application mobile en un clic
Publier une application mobile en un clicFabernovel
 

Similar to Messages Extensions par Nicolas Fontaine (20)

Les vues (views) sous android
Les vues (views) sous androidLes vues (views) sous android
Les vues (views) sous android
 
5.ateliers avancés
5.ateliers avancés5.ateliers avancés
5.ateliers avancés
 
TP_1.pdf
TP_1.pdfTP_1.pdf
TP_1.pdf
 
Les ateliers android_1_vers2015
Les ateliers android_1_vers2015Les ateliers android_1_vers2015
Les ateliers android_1_vers2015
 
Les ateliers android_1_vers2015
Les ateliers android_1_vers2015Les ateliers android_1_vers2015
Les ateliers android_1_vers2015
 
Les ateliers android_1_vers2015
Les ateliers android_1_vers2015Les ateliers android_1_vers2015
Les ateliers android_1_vers2015
 
Mobiliteatime #2 - WatchKit, le framework de développement pour l’Apple Watch
Mobiliteatime #2 - WatchKit, le framework de développement pour l’Apple WatchMobiliteatime #2 - WatchKit, le framework de développement pour l’Apple Watch
Mobiliteatime #2 - WatchKit, le framework de développement pour l’Apple Watch
 
Formation iPhone ENSI by (Orange Tunisie)
Formation iPhone ENSI by (Orange Tunisie)Formation iPhone ENSI by (Orange Tunisie)
Formation iPhone ENSI by (Orange Tunisie)
 
Apple Watch par Benoit Capallere et Joeffrey Bocquet
Apple Watch par Benoit Capallere et Joeffrey BocquetApple Watch par Benoit Capallere et Joeffrey Bocquet
Apple Watch par Benoit Capallere et Joeffrey Bocquet
 
Cycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'AndroidCycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'Android
 
Cycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'AndroidCycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'Android
 
Visual studio 2017 Launch keynote - Afterworks@Noumea
Visual studio 2017 Launch keynote - Afterworks@NoumeaVisual studio 2017 Launch keynote - Afterworks@Noumea
Visual studio 2017 Launch keynote - Afterworks@Noumea
 
Niji_Rapport prévention_2023.pptx
Niji_Rapport prévention_2023.pptxNiji_Rapport prévention_2023.pptx
Niji_Rapport prévention_2023.pptx
 
Rapport final
Rapport finalRapport final
Rapport final
 
Mise en place de l'ActionBarCompat dans vos projets Android.
Mise en place de l'ActionBarCompat dans vos projets Android.Mise en place de l'ActionBarCompat dans vos projets Android.
Mise en place de l'ActionBarCompat dans vos projets Android.
 
Android introvf
Android introvfAndroid introvf
Android introvf
 
Poo
PooPoo
Poo
 
Cours JavaScript.ppt
Cours JavaScript.pptCours JavaScript.ppt
Cours JavaScript.ppt
 
Publier une application mobile en un clic
Publier une application mobile en un clicPublier une application mobile en un clic
Publier une application mobile en un clic
 
Tuto bada
Tuto badaTuto bada
Tuto bada
 

More from Idean France

Start with a Concept and Stop Designing like a Machine
Start with a Concept and Stop Designing like a MachineStart with a Concept and Stop Designing like a Machine
Start with a Concept and Stop Designing like a MachineIdean France
 
Design Systems : à votre marque, prêts, partez !
Design Systems : à votre marque, prêts, partez !Design Systems : à votre marque, prêts, partez !
Design Systems : à votre marque, prêts, partez !Idean France
 
Design systems : Bench et reco sur les outils
Design systems : Bench et reco sur les outilsDesign systems : Bench et reco sur les outils
Design systems : Bench et reco sur les outilsIdean France
 
La recette graphique
La recette graphiqueLa recette graphique
La recette graphiqueIdean France
 
Graph QL par Andy Gigon
Graph QL par Andy GigonGraph QL par Andy Gigon
Graph QL par Andy GigonIdean France
 
Cocoheads react native + redux par Nicolas Fontaine
Cocoheads   react native + redux par Nicolas FontaineCocoheads   react native + redux par Nicolas Fontaine
Cocoheads react native + redux par Nicolas FontaineIdean France
 
Meetup langages visuels - Backelite - novembre 2017
Meetup langages visuels - Backelite - novembre 2017Meetup langages visuels - Backelite - novembre 2017
Meetup langages visuels - Backelite - novembre 2017Idean France
 
Sketch pour les designers : pourquoi, quand et comment l'utiliser ?
Sketch pour les designers : pourquoi, quand et comment l'utiliser ?Sketch pour les designers : pourquoi, quand et comment l'utiliser ?
Sketch pour les designers : pourquoi, quand et comment l'utiliser ?Idean France
 
From Business to Buttons by Pierre Harlé
From Business to Buttons by Pierre HarléFrom Business to Buttons by Pierre Harlé
From Business to Buttons by Pierre HarléIdean France
 
RX Swift avril 2017 - David Yang
RX Swift avril 2017 - David YangRX Swift avril 2017 - David Yang
RX Swift avril 2017 - David YangIdean France
 
UI Design Trends for 2017
UI Design Trends for 2017UI Design Trends for 2017
UI Design Trends for 2017Idean France
 
FLUPA - UX Days 2016 : "Quand les militaires se prennent au jeu du Design Spr...
FLUPA - UX Days 2016 : "Quand les militaires se prennent au jeu du Design Spr...FLUPA - UX Days 2016 : "Quand les militaires se prennent au jeu du Design Spr...
FLUPA - UX Days 2016 : "Quand les militaires se prennent au jeu du Design Spr...Idean France
 
How to design forms that deliver a great user experience
How to design forms that deliver a great user experienceHow to design forms that deliver a great user experience
How to design forms that deliver a great user experienceIdean France
 
The top 9 Tech trends for 2016
The top 9 Tech trends for 2016The top 9 Tech trends for 2016
The top 9 Tech trends for 2016Idean France
 

More from Idean France (14)

Start with a Concept and Stop Designing like a Machine
Start with a Concept and Stop Designing like a MachineStart with a Concept and Stop Designing like a Machine
Start with a Concept and Stop Designing like a Machine
 
Design Systems : à votre marque, prêts, partez !
Design Systems : à votre marque, prêts, partez !Design Systems : à votre marque, prêts, partez !
Design Systems : à votre marque, prêts, partez !
 
Design systems : Bench et reco sur les outils
Design systems : Bench et reco sur les outilsDesign systems : Bench et reco sur les outils
Design systems : Bench et reco sur les outils
 
La recette graphique
La recette graphiqueLa recette graphique
La recette graphique
 
Graph QL par Andy Gigon
Graph QL par Andy GigonGraph QL par Andy Gigon
Graph QL par Andy Gigon
 
Cocoheads react native + redux par Nicolas Fontaine
Cocoheads   react native + redux par Nicolas FontaineCocoheads   react native + redux par Nicolas Fontaine
Cocoheads react native + redux par Nicolas Fontaine
 
Meetup langages visuels - Backelite - novembre 2017
Meetup langages visuels - Backelite - novembre 2017Meetup langages visuels - Backelite - novembre 2017
Meetup langages visuels - Backelite - novembre 2017
 
Sketch pour les designers : pourquoi, quand et comment l'utiliser ?
Sketch pour les designers : pourquoi, quand et comment l'utiliser ?Sketch pour les designers : pourquoi, quand et comment l'utiliser ?
Sketch pour les designers : pourquoi, quand et comment l'utiliser ?
 
From Business to Buttons by Pierre Harlé
From Business to Buttons by Pierre HarléFrom Business to Buttons by Pierre Harlé
From Business to Buttons by Pierre Harlé
 
RX Swift avril 2017 - David Yang
RX Swift avril 2017 - David YangRX Swift avril 2017 - David Yang
RX Swift avril 2017 - David Yang
 
UI Design Trends for 2017
UI Design Trends for 2017UI Design Trends for 2017
UI Design Trends for 2017
 
FLUPA - UX Days 2016 : "Quand les militaires se prennent au jeu du Design Spr...
FLUPA - UX Days 2016 : "Quand les militaires se prennent au jeu du Design Spr...FLUPA - UX Days 2016 : "Quand les militaires se prennent au jeu du Design Spr...
FLUPA - UX Days 2016 : "Quand les militaires se prennent au jeu du Design Spr...
 
How to design forms that deliver a great user experience
How to design forms that deliver a great user experienceHow to design forms that deliver a great user experience
How to design forms that deliver a great user experience
 
The top 9 Tech trends for 2016
The top 9 Tech trends for 2016The top 9 Tech trends for 2016
The top 9 Tech trends for 2016
 

Messages Extensions par Nicolas Fontaine

  • 1. MESSAGE EXTENSIONS COCOAHEADS MONTPELLIER - SESSION OCTOBRE 2016 Swift Nicolas Fontaine
  • 2. 2 Introduction Les applis/extensions iMessage sont une nouveauté iOS10 Elles viennent s’ajouter directement dans l’application message du iDevice et permettent tout un tas de choses. Sky is the limit ! Chose nouvelle de la part d’apple, elles peuvent être indépendantes ! Elles peuvent donc être utilisées comme les today extensions ou être des applications entières à elles seules. Parmis ces extensions il y a un type particulier nommé : « sticker pack application ». Nous ne les verrons que très succinctement puisqu’un enfant de 4 ans pourrait un faire une en 3min montre en main.
  • 3. QUELQUES EXEMPLES : 3 Game pigeon (oui ça s’appelle vraiment comme ça) Un set de jeux iMessage qui rappelle un peu l’époque de MSN Messenger avec ses jeux intégrés.
  • 4. QUELQUES EXEMPLES : 4 Do with me : la todolist collaborative On prend les mêmes et on recommence, voici une Nème application « todolist » mais cette fois-ci entièrement intégrée à iMessage et donc collaborative !
  • 5. 5 SUPER MARIO RUN Stickers : Une pub idéale Simplissime à produire, facile à « vendre », les stickers app sont une véritable mine d’or. La plupart se vendent à 0,99€. Les autres, gratuites, servent de publicité à une autre application (possiblement payante) comme Mario Run ici. QUELQUES EXEMPLES :
  • 6. 1 - CRÉER SON EXTENSION MESSAGE
  • 7. 7 Créer une sticker pack application Nouveau projet -> Stickers pack application Après c’est UNIQUEMENT du drag&drop
  • 8. 8 Créer son application Message Pour ajouter une extension Message à une application, il faut simplement le faire depuis l’écran d’ajout d’une target. L’une des options disponible sera « Message Extension ». Cela créé tous les fichiers nécessaires à l’initialisation de votre extension : • Un storyboard • Un images.assets • Un info.plist • Un viewController héritant de : MSMessagesAppViewController • Ce view controller DOIT rester le point d’entrée de votre storyboard
  • 9. 2 - ARCHITECTURER SON EXTENSION MESSAGE Recommandations
  • 10. 10 Architecturer son extension Message Le MSMessagesAppViewController sera la clé de voute de l’application. Pour une application de cette taille, on pourra se permettre de lui confier le gros du boulot. Cependant il est sûrement possible de factoriser, ou utiliser des delegate pour ne pas l’encombrer. Pourquoi est-il important : • Il est le seul à avoir accès à l’objet : activeConversation • Il possède des méthodes lifecycle/delegate essentielles • Il peut demander l’affichage au format compact ou étendu
  • 11. 11 Conversation MSMessagesApp ViewController ViewController 1 ViewController 3 ViewController 2 Child Delegate Créer / Utilise les messages Gère la conversation et les interactions utilisateur avec la conversation Architecturer son extension Message
  • 12. 12 override func willTransition(to presentationStyle: MSMessagesAppPresentationStyle) override func willBecomeActive(with conversation: MSConversation) Une gestion du lifeCycle inhabituelle Deux style de présentation : requestPresentationStyle(MSMessagesAppPresentationStyle.compact) requestPresentationStyle(MSMessagesAppPresentationStyle.expanded) Architecturer son extension Message
  • 13. 13 Passer des données dans un message Model de données • var1 • var2 • var3 ?var1=xxx&var2=xxx&var3=xxx toUrl() URL (NSURL en obj-c) Architecturer son extension Message
  • 14. 3 - ENVOYER DES MESSAGES, GÉRER UNE SESSION
  • 15. 15 Créer un message, faire passer des données et gérer son aspect let newMessage:MSMessage = MSMessage(session : MSSession()) let newMessageLayout:MSMessageTemplateLayout = MSMessageTemplateLayout.init() newMessageLayout.caption = "Depuis compte : (transactionOutAccount)" newMessage.url = URL.init(string: transactionToSend.toUrl()) newMessageLayout.image = createImageForTransaction(message: "Proposition de virement",amount: transactionToSend.amount) newMessage.layout = newMessageLayout
  • 16. 16 Générer une image dynamiquement pour remplir son message UIGraphicsBeginImageContextWithOptions(toImageView.frame.size, false, UIScreen.main.scale) toImageView.drawHierarchy(in: toImageView.bounds, afterScreenUpdates: true) let image = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() Une solution simple est de créer un contenu complet avec des views avant d’utiliser le code suivant :
  • 17. 17 Envoyer un message activeConversation.insert(currentMessage, completionHandler: nil) override func didStartSending(_ message: MSMessage, conversation: MSConversation) { // Quand l’utilisateur appuie sur le bouton d’envoi } override func didCancelSending(_ message: MSMessage, conversation: MSConversation) { // Quand l’utilisateur supprime un message créé précédemment sans l’envoyer } Mais cela ne nous permet pas d’envoyer directement le message, l’utilisateur doit compléter (s’il le veut) et envoyer par la suite. Heureusement, nous avons de jolis méthodes delegate !
  • 18. 18 Récupérer un(e) message/session Pour que l’échange soit user-friendly, nous allons devoir réutiliser la même session pour que l’utilisateur ai l’impression de faire passer un même message. guard let activeConversation = activeConversation, let selectedMessage = activeConversation.selectedMessage, let session = selectedMessage.session else { return } Là, je me suis assuré de la présence d’une conversation, d’un message sélectionné et de la session à laquelle il appartient. Je vais pouvoir m’en servir pour : let replyMessage = MSMessage(session: session) let currentTransaction = TransactionModel.init(argumentUrl: selectedMessage.url) • Utiliser le contenu du message sélectionné : • Créer une réponse :
  • 19. 19 Identifier un message Les messages sont « signés » à l’aide d’un UDID propre à un utilisateur dans la conversation en cours. let senderId = selectedMessage.senderParticipantIdentifier.uuidString let myId = conversation.localParticipantIdentifier.uuidString if (senderId == myId){ controller = instanciateMessageViewController(withMessage: "C'est pas ton tour Jean Michel !") } open var remoteParticipantIdentifiers: [UUID] { get } Pour connaître tous les participants à la conversation, MSConversation contient :
  • 20. 20 Pour aller plus loin avec le MSMessagesAppViewController Life cycle : open func willBecomeActive(with conversation: MSConversation) open func didBecomeActive(with conversation: MSConversation) open func willResignActive(with conversation: MSConversation) open func didResignActive(with conversation: MSConversation) open func willSelect(_ message: MSMessage, conversation: MSConversation) open func didSelect(_ message: MSMessage, conversation: MSConversation) open func didReceive(_ message: MSMessage, conversation: MSConversation) open func didStartSending(_ message: MSMessage, conversation: MSConversation) open func didCancelSending(_ message: MSMessage, conversation: MSConversation) open func willTransition(to presentationStyle: MSMessagesAppPresentationStyle) open func didTransition(to presentationStyle: MSMessagesAppPresentationStyle) Autres : open func requestPresentationStyle(_ presentationStyle: MSMessagesAppPresentationStyle) open func dismiss()
  • 21. 21 Pour aller plus loin avec les MSMessage // Si ce booléen est vrai, le message s’effacera peu après la lecture de l’interlocuteur open var shouldExpire: Bool // Celui qu’on ne remplis jamais alors que ça ferrait de nous des gens sympa open var accessibilityLabel: String? // Un récapitulatif du contenu du message pour ce qui ne le voient pas tel quel (ex : vielle version d’iOS) open var summaryText: String? // Si le message n’a pas été envoyé, la raison de trouve ici open var error: Error?
  • 22. 22 Aller plus loin avec MSConversation func didChooseRIBSend() { let urlpath = Bundle.main.path(forResource: "sample", ofType: "pdf") let url:URL = URL(fileURLWithPath: urlpath!) activeConversation?.insertAttachment(url, withAlternateFilename: "RIB de Jean-Michel POC", completionHandler: nil) activeConversation?.insertText("Voici mon RIB", completionHandler: nil) }
  • 23. 4 - DÉMO / PRÉSENTATION DU CODE SupaBank et son extension Message pour générer un virement entre deux de ses clients
  • 24. MERCI POUR VOTRE ATTENTION ! AVEZ-VOUS DES QUESTIONS ? Contact : fontaine.nicolas34@gmail.com