SlideShare uma empresa Scribd logo
1 de 41
Baixar para ler offline
LET'S TAKE THIS OFFLINE

Comment faire une application qui fonctionne hors connexion ?
@ClaireReynaud

www.babelbytes.com
Et vous ?
Sujet de cette présentation

Des méthodes pour implémenter des applications
en mode déconnecté
Exemples:
iOS

REST API

Django REST Framework
Le code de la démo
https://github.com/creynaud/notes-iphone-app
https://github.com/creynaud/notes-server
https://awesomenotes.herokuapp.com/api/
Qu'est-ce que j'entends
par "fonctionner en mode
déconnecté" ?
Pas de réseau ou un réseau lent

Photo by Danka Peter
Pas de réseau ou un réseau lent

Photo by James Evans
Pas de réseau ou un réseau lent

Un utilisateur ne devrait pas attendre
pour relire du contenu auquel il a déjà
accédé
Pas de réseau ou un réseau lent

Un utilisateur devrait pouvoir poster du
contenu à tout moment
Pourquoi implémenter un
mode déconnecté ?
L'application Facebook il y a un an
Pas vraiment l'expérience
utilisateur qu'on souhaite
avoir...
On s'attend à toujours voir du contenu
Les réseaux mobiles sont différents
La latence est élevée

La vitesse est très variable, ce qui est le pire en
terme d'expérience utilisateur
"Faster Websites: Crash Course on Frontend
Performance (Part 1/2)", Devoxx 2012
Comment se comporte mon app
en conditions réelles ?
Et si on réimplémentait
Evernote ?
Enfin, juste la partie notes de texte ;)
En 3 étapes

1. Lire des notes en mode déconnecté

2. Créer des notes en mode déconnecté

3. Mettre à jour des notes en mode déconnecté et
résoudre des conflits
Une seule chose à
retenir : versioner les
objets notes !
Architecture d'une application mobile
REST API

GET /notes

GET /notes/{uuid}
POST /notes

PUT /notes/{uuid}

DELETE /notes/{uuid}
Photo by Ilham Rahmansyah

1. Lire des notes en mode
déconnecté
Lire des notes en mode déconnecté

Lire les documents JSON depuis un
cache local côté client
HTTP a un mécanisme
de cache, non ?
On a besoin d'un cache de plus haut
niveau

Si on veut faire des recherches en mode déconnecté
Ou si on veut faire de l'édition en mode déconnecté

J'ai choisi d'utiliser CoreData au-dessus de SQLite
pour mon app d'exemple.
Selon les besoins, stocker le document JSON "brut"
dans un store clé/valeur peut suffir.
Qu'est-ce qu'on garde du caching HTTP ?
Par exemple, je ne veux pas télécharger la même version
d'un document JSON si elle est déjà dans mon cache
HTTP.
C'est possible avec les headers HTTP suivants :
Cache-Control

Etag et If-None-Match

ou Last-Modified et If-Modified-Since
Le cache HTTP, en
pratique, ça donne quoi ?
Cache HTTP GET avec ETAG

Article de blog sur NSURLCache, les politiques de cache
HTTP et les ETAG
Photo by Ilham Rahmansyah

2. Créer des notes en
mode déconnecté
Créer des notes en mode déconnecté

1. Stocker le document JSON qui doit être posté (par
exemple dans SQLite)

2. Essayer de poster le document JSON vers le server
en tâche de fond
3. Marquer le document JSON comme posté avec
succès seulement si le POST retourne OK
4. En cas d'échec du POST, essayer à nouveau de
poster le document JSON à la prochaine
synchronization avec le serveur
Photo by Ilham Rahmansyah

3. Résoudre des conflits
lors de l'édition de notes
Résoudre des conflits lors de l'édition
Si vous laissez la possibilité à l'utilisateur d'éditer en
mode déconnecté, des conflits vont se produire (même
s'il n'y a pas d'édition multi-utilisateur).
La détection de conflit
devrait être intégrée à
l'API REST !
La *détection*, pas la
*résolution*
Ça donne quoi dans
l'API REST ?
Et la synchronisation dans
l'application ?
Deux mots sur le back-end et l'API REST
REST API

GET /notes-uuids
GET /notes

GET /notes/{uuid}
POST /notes

PUT /notes/{uuid}

DELETE /notes/{uuid}
Django REST framework

Ajouter un UUID et une révision dans les objets Note
Rejeter les requêtes PUT ou DELETE si la révision
n'est pas spécifiée (400 Bad request)
Rejeter les requêtes PUT ou DELETE si la révision
n'est pas la révision courante (409 Conflict)
Ajouter le header ETAG

Tout le reste est déjà fourni !
https://github.com/creynaud/notes-server
Résumé

Ajouter un UUID et une révision dans tous les
documents JSON

Lecture hors connexion: stocker les documents JSON
en local côté client
Création hors connexion: poster vers le serveur en
background et re-essayer en cas d'échec
Mise à jour hors connexion: gérer les conflits

Essayer de tirer profit du cache HTTP (headers
Cache-Control, Etag et If-None-Match)
Merci ! Questions ?

Mais conteúdo relacionado

Destaque

S1 GE Handout 1 - Water Supply (Teacher)
S1 GE Handout 1 - Water Supply (Teacher) S1 GE Handout 1 - Water Supply (Teacher)
S1 GE Handout 1 - Water Supply (Teacher) LEEENNA
 
Viernes basico
Viernes basicoViernes basico
Viernes basicoadjnt1979
 
Instancia
InstanciaInstancia
Instanciadurales
 
Conférence Social Media par So-Buzz au CJD à Paris #SoBuzzConf
Conférence Social Media par So-Buzz au CJD à Paris #SoBuzzConfConférence Social Media par So-Buzz au CJD à Paris #SoBuzzConf
Conférence Social Media par So-Buzz au CJD à Paris #SoBuzzConfSo-Buzz
 
Comisión de Juicio Político
Comisión de Juicio PolíticoComisión de Juicio Político
Comisión de Juicio PolíticoLaura Alonso
 
Agile Japan 2015金沢サテライト
Agile Japan 2015金沢サテライトAgile Japan 2015金沢サテライト
Agile Japan 2015金沢サテライトHisashi Yanagisawa
 
สถิติปี2555 แก้ไขเอกสารบทที่ 1
สถิติปี2555 แก้ไขเอกสารบทที่ 1สถิติปี2555 แก้ไขเอกสารบทที่ 1
สถิติปี2555 แก้ไขเอกสารบทที่ 1jutatip pairuangsom
 
Donald zolan -_los_nios___(fm--
Donald zolan -_los_nios___(fm--Donald zolan -_los_nios___(fm--
Donald zolan -_los_nios___(fm--enquica
 
video chat with Neema, Faddy, and Joe
video chat with Neema, Faddy, and Joevideo chat with Neema, Faddy, and Joe
video chat with Neema, Faddy, and Joeroshiniabdeen
 
Luis Ferragut - Building Information Modelling (BIM)
Luis Ferragut - Building Information Modelling (BIM)Luis Ferragut - Building Information Modelling (BIM)
Luis Ferragut - Building Information Modelling (BIM)Fundación Ramón Areces
 
Imam ahmad raza ki hashiya nigari
Imam ahmad raza ki hashiya nigariImam ahmad raza ki hashiya nigari
Imam ahmad raza ki hashiya nigariMuhammad Tariq
 
днз №400 група №7
днз №400 група №7днз №400 група №7
днз №400 група №7Yuyko
 
Балхүү үнэнээ хэлсэн нь
Балхүү үнэнээ хэлсэн ньБалхүү үнэнээ хэлсэн нь
Балхүү үнэнээ хэлсэн ньOtgondulam
 
Still Life Powerpoint
Still Life PowerpointStill Life Powerpoint
Still Life PowerpointHannah Senger
 
Resto, Stangenmaterial kompakt gelagert
Resto, Stangenmaterial kompakt gelagertResto, Stangenmaterial kompakt gelagert
Resto, Stangenmaterial kompakt gelagertCornelis Bonnema
 

Destaque (19)

S1 GE Handout 1 - Water Supply (Teacher)
S1 GE Handout 1 - Water Supply (Teacher) S1 GE Handout 1 - Water Supply (Teacher)
S1 GE Handout 1 - Water Supply (Teacher)
 
Viernes basico
Viernes basicoViernes basico
Viernes basico
 
Instancia
InstanciaInstancia
Instancia
 
Conférence Social Media par So-Buzz au CJD à Paris #SoBuzzConf
Conférence Social Media par So-Buzz au CJD à Paris #SoBuzzConfConférence Social Media par So-Buzz au CJD à Paris #SoBuzzConf
Conférence Social Media par So-Buzz au CJD à Paris #SoBuzzConf
 
Comisión de Juicio Político
Comisión de Juicio PolíticoComisión de Juicio Político
Comisión de Juicio Político
 
Agile Japan 2015金沢サテライト
Agile Japan 2015金沢サテライトAgile Japan 2015金沢サテライト
Agile Japan 2015金沢サテライト
 
Becquer
BecquerBecquer
Becquer
 
สถิติปี2555 แก้ไขเอกสารบทที่ 1
สถิติปี2555 แก้ไขเอกสารบทที่ 1สถิติปี2555 แก้ไขเอกสารบทที่ 1
สถิติปี2555 แก้ไขเอกสารบทที่ 1
 
Cheryl-Holland
Cheryl-HollandCheryl-Holland
Cheryl-Holland
 
Donald zolan -_los_nios___(fm--
Donald zolan -_los_nios___(fm--Donald zolan -_los_nios___(fm--
Donald zolan -_los_nios___(fm--
 
video chat with Neema, Faddy, and Joe
video chat with Neema, Faddy, and Joevideo chat with Neema, Faddy, and Joe
video chat with Neema, Faddy, and Joe
 
Luis Ferragut - Building Information Modelling (BIM)
Luis Ferragut - Building Information Modelling (BIM)Luis Ferragut - Building Information Modelling (BIM)
Luis Ferragut - Building Information Modelling (BIM)
 
Imam ahmad raza ki hashiya nigari
Imam ahmad raza ki hashiya nigariImam ahmad raza ki hashiya nigari
Imam ahmad raza ki hashiya nigari
 
днз №400 група №7
днз №400 група №7днз №400 група №7
днз №400 група №7
 
Resumen roma
Resumen romaResumen roma
Resumen roma
 
Балхүү үнэнээ хэлсэн нь
Балхүү үнэнээ хэлсэн ньБалхүү үнэнээ хэлсэн нь
Балхүү үнэнээ хэлсэн нь
 
Still Life Powerpoint
Still Life PowerpointStill Life Powerpoint
Still Life Powerpoint
 
Galileo Galilei
Galileo GalileiGalileo Galilei
Galileo Galilei
 
Resto, Stangenmaterial kompakt gelagert
Resto, Stangenmaterial kompakt gelagertResto, Stangenmaterial kompakt gelagert
Resto, Stangenmaterial kompakt gelagert
 

Semelhante a CocoaHeads Lyon - Mode Déconnecté dans une app iOS

20091020 - Normandy Jug - Builders Battle
20091020 - Normandy Jug - Builders Battle20091020 - Normandy Jug - Builders Battle
20091020 - Normandy Jug - Builders BattleArnaud Héritier
 
20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache MavenArnaud Héritier
 
Presentation JEE et son écossystéme
Presentation JEE et son écossystémePresentation JEE et son écossystéme
Presentation JEE et son écossystémeAlgeria JUG
 
BordeauxJUG : Portails & Portlets Java
BordeauxJUG : Portails & Portlets JavaBordeauxJUG : Portails & Portlets Java
BordeauxJUG : Portails & Portlets JavaCamblor Frédéric
 
Webserver tomcat-jboss-jrun-jonas doc
Webserver tomcat-jboss-jrun-jonas docWebserver tomcat-jboss-jrun-jonas doc
Webserver tomcat-jboss-jrun-jonas docWinslo Nwan
 
20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache MavenArnaud Héritier
 
Lbv Dev Meetup #1
Lbv Dev Meetup #1Lbv Dev Meetup #1
Lbv Dev Meetup #1LbvDev
 
ACRA - Présentation PAUG Avril 2011
ACRA - Présentation PAUG Avril 2011ACRA - Présentation PAUG Avril 2011
ACRA - Présentation PAUG Avril 2011Kevin Gaudin
 
GtugDakar AppEngine, Gwt
GtugDakar AppEngine, GwtGtugDakar AppEngine, Gwt
GtugDakar AppEngine, Gwthkairi
 
Presentation Spring, Spring MVC
Presentation Spring, Spring MVCPresentation Spring, Spring MVC
Presentation Spring, Spring MVCNathaniel Richand
 
Bilinguisme et word_press_plugins_et_astuces
Bilinguisme et word_press_plugins_et_astucesBilinguisme et word_press_plugins_et_astuces
Bilinguisme et word_press_plugins_et_astucesyannickcg
 
Spring boot anane maryem ben aziza syrine
Spring boot anane maryem ben aziza syrineSpring boot anane maryem ben aziza syrine
Spring boot anane maryem ben aziza syrineSyrine Ben aziza
 
Devoxx 2017 : toutes les actualités technologiques à surveiller !
Devoxx 2017 : toutes les actualités technologiques à surveiller !Devoxx 2017 : toutes les actualités technologiques à surveiller !
Devoxx 2017 : toutes les actualités technologiques à surveiller !Société ELOSI
 
Resource Oriented Architecture
Resource Oriented ArchitectureResource Oriented Architecture
Resource Oriented ArchitectureDNG Consulting
 
Programmation_JEE_Version_imprimable.pdf
Programmation_JEE_Version_imprimable.pdfProgrammation_JEE_Version_imprimable.pdf
Programmation_JEE_Version_imprimable.pdfngombeemmanuel
 

Semelhante a CocoaHeads Lyon - Mode Déconnecté dans une app iOS (20)

20091020 - Normandy Jug - Builders Battle
20091020 - Normandy Jug - Builders Battle20091020 - Normandy Jug - Builders Battle
20091020 - Normandy Jug - Builders Battle
 
Chapter1
Chapter1Chapter1
Chapter1
 
20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven20081113 - Nantes Jug - Apache Maven
20081113 - Nantes Jug - Apache Maven
 
Spring Boot RestApi.pptx
Spring Boot RestApi.pptxSpring Boot RestApi.pptx
Spring Boot RestApi.pptx
 
Hibernate jpa
Hibernate jpaHibernate jpa
Hibernate jpa
 
Presentation JEE et son écossystéme
Presentation JEE et son écossystémePresentation JEE et son écossystéme
Presentation JEE et son écossystéme
 
BordeauxJUG : Portails & Portlets Java
BordeauxJUG : Portails & Portlets JavaBordeauxJUG : Portails & Portlets Java
BordeauxJUG : Portails & Portlets Java
 
Webserver tomcat-jboss-jrun-jonas doc
Webserver tomcat-jboss-jrun-jonas docWebserver tomcat-jboss-jrun-jonas doc
Webserver tomcat-jboss-jrun-jonas doc
 
spring-api-rest.pdf
spring-api-rest.pdfspring-api-rest.pdf
spring-api-rest.pdf
 
20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven20090615 - Ch'ti JUG - Apache Maven
20090615 - Ch'ti JUG - Apache Maven
 
Lbv Dev Meetup #1
Lbv Dev Meetup #1Lbv Dev Meetup #1
Lbv Dev Meetup #1
 
ACRA - Présentation PAUG Avril 2011
ACRA - Présentation PAUG Avril 2011ACRA - Présentation PAUG Avril 2011
ACRA - Présentation PAUG Avril 2011
 
GtugDakar AppEngine, Gwt
GtugDakar AppEngine, GwtGtugDakar AppEngine, Gwt
GtugDakar AppEngine, Gwt
 
Presentation Spring, Spring MVC
Presentation Spring, Spring MVCPresentation Spring, Spring MVC
Presentation Spring, Spring MVC
 
Bilinguisme et word_press_plugins_et_astuces
Bilinguisme et word_press_plugins_et_astucesBilinguisme et word_press_plugins_et_astuces
Bilinguisme et word_press_plugins_et_astuces
 
Spring boot anane maryem ben aziza syrine
Spring boot anane maryem ben aziza syrineSpring boot anane maryem ben aziza syrine
Spring boot anane maryem ben aziza syrine
 
Presentation Spring
Presentation SpringPresentation Spring
Presentation Spring
 
Devoxx 2017 : toutes les actualités technologiques à surveiller !
Devoxx 2017 : toutes les actualités technologiques à surveiller !Devoxx 2017 : toutes les actualités technologiques à surveiller !
Devoxx 2017 : toutes les actualités technologiques à surveiller !
 
Resource Oriented Architecture
Resource Oriented ArchitectureResource Oriented Architecture
Resource Oriented Architecture
 
Programmation_JEE_Version_imprimable.pdf
Programmation_JEE_Version_imprimable.pdfProgrammation_JEE_Version_imprimable.pdf
Programmation_JEE_Version_imprimable.pdf
 

CocoaHeads Lyon - Mode Déconnecté dans une app iOS

  • 1. LET'S TAKE THIS OFFLINE Comment faire une application qui fonctionne hors connexion ?
  • 4. Sujet de cette présentation Des méthodes pour implémenter des applications en mode déconnecté Exemples: iOS REST API Django REST Framework
  • 5. Le code de la démo https://github.com/creynaud/notes-iphone-app https://github.com/creynaud/notes-server https://awesomenotes.herokuapp.com/api/
  • 6. Qu'est-ce que j'entends par "fonctionner en mode déconnecté" ?
  • 7. Pas de réseau ou un réseau lent Photo by Danka Peter
  • 8. Pas de réseau ou un réseau lent Photo by James Evans
  • 9. Pas de réseau ou un réseau lent Un utilisateur ne devrait pas attendre pour relire du contenu auquel il a déjà accédé
  • 10. Pas de réseau ou un réseau lent Un utilisateur devrait pouvoir poster du contenu à tout moment
  • 13. Pas vraiment l'expérience utilisateur qu'on souhaite avoir...
  • 14. On s'attend à toujours voir du contenu
  • 15. Les réseaux mobiles sont différents La latence est élevée La vitesse est très variable, ce qui est le pire en terme d'expérience utilisateur "Faster Websites: Crash Course on Frontend Performance (Part 1/2)", Devoxx 2012
  • 16. Comment se comporte mon app en conditions réelles ?
  • 17. Et si on réimplémentait Evernote ? Enfin, juste la partie notes de texte ;)
  • 18. En 3 étapes 1. Lire des notes en mode déconnecté 2. Créer des notes en mode déconnecté 3. Mettre à jour des notes en mode déconnecté et résoudre des conflits
  • 19. Une seule chose à retenir : versioner les objets notes !
  • 21. REST API GET /notes GET /notes/{uuid} POST /notes PUT /notes/{uuid} DELETE /notes/{uuid}
  • 22. Photo by Ilham Rahmansyah 1. Lire des notes en mode déconnecté
  • 23. Lire des notes en mode déconnecté Lire les documents JSON depuis un cache local côté client
  • 24. HTTP a un mécanisme de cache, non ?
  • 25. On a besoin d'un cache de plus haut niveau Si on veut faire des recherches en mode déconnecté Ou si on veut faire de l'édition en mode déconnecté J'ai choisi d'utiliser CoreData au-dessus de SQLite pour mon app d'exemple. Selon les besoins, stocker le document JSON "brut" dans un store clé/valeur peut suffir.
  • 26. Qu'est-ce qu'on garde du caching HTTP ? Par exemple, je ne veux pas télécharger la même version d'un document JSON si elle est déjà dans mon cache HTTP. C'est possible avec les headers HTTP suivants : Cache-Control Etag et If-None-Match ou Last-Modified et If-Modified-Since
  • 27. Le cache HTTP, en pratique, ça donne quoi ?
  • 28. Cache HTTP GET avec ETAG Article de blog sur NSURLCache, les politiques de cache HTTP et les ETAG
  • 29. Photo by Ilham Rahmansyah 2. Créer des notes en mode déconnecté
  • 30. Créer des notes en mode déconnecté 1. Stocker le document JSON qui doit être posté (par exemple dans SQLite) 2. Essayer de poster le document JSON vers le server en tâche de fond 3. Marquer le document JSON comme posté avec succès seulement si le POST retourne OK 4. En cas d'échec du POST, essayer à nouveau de poster le document JSON à la prochaine synchronization avec le serveur
  • 31. Photo by Ilham Rahmansyah 3. Résoudre des conflits lors de l'édition de notes
  • 32. Résoudre des conflits lors de l'édition Si vous laissez la possibilité à l'utilisateur d'éditer en mode déconnecté, des conflits vont se produire (même s'il n'y a pas d'édition multi-utilisateur).
  • 33. La détection de conflit devrait être intégrée à l'API REST !
  • 34. La *détection*, pas la *résolution*
  • 35. Ça donne quoi dans l'API REST ?
  • 36. Et la synchronisation dans l'application ?
  • 37. Deux mots sur le back-end et l'API REST
  • 38. REST API GET /notes-uuids GET /notes GET /notes/{uuid} POST /notes PUT /notes/{uuid} DELETE /notes/{uuid}
  • 39. Django REST framework Ajouter un UUID et une révision dans les objets Note Rejeter les requêtes PUT ou DELETE si la révision n'est pas spécifiée (400 Bad request) Rejeter les requêtes PUT ou DELETE si la révision n'est pas la révision courante (409 Conflict) Ajouter le header ETAG Tout le reste est déjà fourni ! https://github.com/creynaud/notes-server
  • 40. Résumé Ajouter un UUID et une révision dans tous les documents JSON Lecture hors connexion: stocker les documents JSON en local côté client Création hors connexion: poster vers le serveur en background et re-essayer en cas d'échec Mise à jour hors connexion: gérer les conflits Essayer de tirer profit du cache HTTP (headers Cache-Control, Etag et If-None-Match)