Présentation du 14/11/2013 à CocoaHeads Lyon.
Comment faire une application qui fonctionne hors connexion ?
Le code des exemples est sur github :
https://github.com/creynaud/notes-iphone-app
https://github.com/creynaud/notes-server
Le post de blog (en anglais) : https://www.clairereynaud.net/blog/adding-offline-mode-to-your-mobile-app/
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
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
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
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 !
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)