messages extensions par nicolas fontaine
TRANSCRIPT
![Page 1: Messages Extensions par Nicolas Fontaine](https://reader031.vdocuments.site/reader031/viewer/2022020410/58766c6b1a28abd0018b5755/html5/thumbnails/1.jpg)
MESSAGE EXTENSIONS COCOAHEADS MONTPELLIER - SESSION OCTOBRE 2016
SwiftNicolas Fontaine
![Page 2: Messages Extensions par Nicolas Fontaine](https://reader031.vdocuments.site/reader031/viewer/2022020410/58766c6b1a28abd0018b5755/html5/thumbnails/2.jpg)
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.
![Page 3: Messages Extensions par Nicolas Fontaine](https://reader031.vdocuments.site/reader031/viewer/2022020410/58766c6b1a28abd0018b5755/html5/thumbnails/3.jpg)
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.
![Page 4: Messages Extensions par Nicolas Fontaine](https://reader031.vdocuments.site/reader031/viewer/2022020410/58766c6b1a28abd0018b5755/html5/thumbnails/4.jpg)
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 !
![Page 5: Messages Extensions par Nicolas Fontaine](https://reader031.vdocuments.site/reader031/viewer/2022020410/58766c6b1a28abd0018b5755/html5/thumbnails/5.jpg)
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 :
![Page 6: Messages Extensions par Nicolas Fontaine](https://reader031.vdocuments.site/reader031/viewer/2022020410/58766c6b1a28abd0018b5755/html5/thumbnails/6.jpg)
1 - CRÉER SON EXTENSION MESSAGE
![Page 7: Messages Extensions par Nicolas Fontaine](https://reader031.vdocuments.site/reader031/viewer/2022020410/58766c6b1a28abd0018b5755/html5/thumbnails/7.jpg)
7
Créer une sticker pack application
Nouveau projet -> Stickers pack application
Après c’est UNIQUEMENT du drag&drop
![Page 8: Messages Extensions par Nicolas Fontaine](https://reader031.vdocuments.site/reader031/viewer/2022020410/58766c6b1a28abd0018b5755/html5/thumbnails/8.jpg)
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
![Page 9: Messages Extensions par Nicolas Fontaine](https://reader031.vdocuments.site/reader031/viewer/2022020410/58766c6b1a28abd0018b5755/html5/thumbnails/9.jpg)
2 - ARCHITECTURER SON EXTENSION MESSAGERecommandations
![Page 10: Messages Extensions par Nicolas Fontaine](https://reader031.vdocuments.site/reader031/viewer/2022020410/58766c6b1a28abd0018b5755/html5/thumbnails/10.jpg)
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
![Page 11: Messages Extensions par Nicolas Fontaine](https://reader031.vdocuments.site/reader031/viewer/2022020410/58766c6b1a28abd0018b5755/html5/thumbnails/11.jpg)
11
ConversationMSMessagesAppViewController
ViewController 1
ViewController 3
ViewController 2Child
Delegate
Créer / Utilise les messages Gère la conversation et les
interactions utilisateur avec la conversation
Architecturer son extension Message
![Page 12: Messages Extensions par Nicolas Fontaine](https://reader031.vdocuments.site/reader031/viewer/2022020410/58766c6b1a28abd0018b5755/html5/thumbnails/12.jpg)
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
![Page 13: Messages Extensions par Nicolas Fontaine](https://reader031.vdocuments.site/reader031/viewer/2022020410/58766c6b1a28abd0018b5755/html5/thumbnails/13.jpg)
13
Passer des données dans un message
Model de données
• var1 • var2 • var3
?var1=xxx&var2=xxx&var3=xxxtoUrl()
URL (NSURL en obj-c)
Architecturer son extension Message
![Page 14: Messages Extensions par Nicolas Fontaine](https://reader031.vdocuments.site/reader031/viewer/2022020410/58766c6b1a28abd0018b5755/html5/thumbnails/14.jpg)
3 - ENVOYER DES MESSAGES, GÉRER UNE SESSION
![Page 15: Messages Extensions par Nicolas Fontaine](https://reader031.vdocuments.site/reader031/viewer/2022020410/58766c6b1a28abd0018b5755/html5/thumbnails/15.jpg)
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
![Page 16: Messages Extensions par Nicolas Fontaine](https://reader031.vdocuments.site/reader031/viewer/2022020410/58766c6b1a28abd0018b5755/html5/thumbnails/16.jpg)
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 :
![Page 17: Messages Extensions par Nicolas Fontaine](https://reader031.vdocuments.site/reader031/viewer/2022020410/58766c6b1a28abd0018b5755/html5/thumbnails/17.jpg)
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 !
![Page 18: Messages Extensions par Nicolas Fontaine](https://reader031.vdocuments.site/reader031/viewer/2022020410/58766c6b1a28abd0018b5755/html5/thumbnails/18.jpg)
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 :
![Page 19: Messages Extensions par Nicolas Fontaine](https://reader031.vdocuments.site/reader031/viewer/2022020410/58766c6b1a28abd0018b5755/html5/thumbnails/19.jpg)
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 :
![Page 20: Messages Extensions par Nicolas Fontaine](https://reader031.vdocuments.site/reader031/viewer/2022020410/58766c6b1a28abd0018b5755/html5/thumbnails/20.jpg)
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()
![Page 21: Messages Extensions par Nicolas Fontaine](https://reader031.vdocuments.site/reader031/viewer/2022020410/58766c6b1a28abd0018b5755/html5/thumbnails/21.jpg)
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?
![Page 22: Messages Extensions par Nicolas Fontaine](https://reader031.vdocuments.site/reader031/viewer/2022020410/58766c6b1a28abd0018b5755/html5/thumbnails/22.jpg)
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)
}
![Page 23: Messages Extensions par Nicolas Fontaine](https://reader031.vdocuments.site/reader031/viewer/2022020410/58766c6b1a28abd0018b5755/html5/thumbnails/23.jpg)
4 - DÉMO / PRÉSENTATION DU CODE
SupaBank et son extension Message pour générer un virement entre deux de ses clients