Avant de nous jeter à l'eau, je vous propose de prendre cinq petites minutes pour prendre du recul sur la persistance des données ! Oui je sais, votre clavier vous démange, mais le sujet de la persistance est trop important et trop vaste pour se passer d'une vue d'ensemble du sujet.
La persistance, c'est quoi ?
Dans les applications que vous avez déjà développées, vous vous êtes sans doute déjà frotté au problème suivant : si vous sauvegardez des données dans votre modèle, par exemple, ou dans une variable de votre contrôleur, ces données sont perdues dès que vous fermez l'application.
La raison, c'est que lorsque l'application est supprimée, le processeur est libéré de toute activité liée à cette application, et donc toutes les données en mémoire sont supprimées.
La persistance désigne l'ensemble des techniques qui permettent de stocker des données sur votre iPhone. Grâce à la persistance, les données peuvent rester stockées tant que l'application est installée sur le téléphone.
Découvrez les techniques de la persistance
La persistance c'est donc un ensemble de techniques. Alors je vous propose qu'on voie ce qu'elles sont !
Le schéma suivant résume la grande majorité des techniques de persistance utilisées en iOS.
Ce schéma présente dans les carrés blancs les différentes techniques de persistance. La légende indique le(s) type(s) de chaque technique. Enfin, ce schéma illustre les mécanismes employés pour passer d'un objet Swift (une classe ou une structure) au format de données utilisé dans chaque cas.
Je vous propose de vous exposer rapidement chacune de ces techniques.
UserDefaults
Les UserDefaults sont tout simplement un dictionnaire qui persiste. C'est donc un outil très simple, mais aussi peu adapté à de grandes quantités de données. En général, on l'utilise pour de petites choses comme les préférences utilisateurs, d'où son nom.
Unix File System / UIDocument
Unix File System
et UIDocument
sont deux techniques de persistance qui s'appuient sur des fichiers.
Tout d'abord, vous allez convertir des objets Swift en type Data
. Il existe deux mécanismes possibles pour cela :
NSKeyedArchiver
: l'ancien mécanisme voué sans doute à disparaître ;Le protocole
Codable
de Swift : extrêmement puissant et facile à utiliser.
Ensuite, les Data
sont enregistrées dans un fichier. Ce fichier est sauvegardé dans un dossier réservé à votre application.
Si vous utilisez Unix File System
, le fichier sera sauvegardé et seul un développeur pourra le manipuler. C'est utile pour sauvegarder des données que vous voulez protéger d'une manipulation hasardeuse d'un utilisateur.
À l'inverse, UIDocument
sauvegarde des fichiers au sens utilisateur. Cela signifie que l'utilisateur pourra ouvrir et accéder à ce fichier comme lorsque vous ouvrez un fichier dans le Finder de votre Mac.
UIDocument
fonctionne notamment avec l'application Fichiers présente depuis iOS 11, et qui permet à l'utilisateur d'accéder à ses fichiers. Cela vous permet notamment de sauvegarder des fichiers directement sur iCloud Drive, la solution de stockage en ligne d'Apple.
SQLite / CoreData
Sauvegarder des fichiers, c'est bien. Mais parfois vous avez besoin de la robustesse et des outils que propose une vraie base de données. Et pour cela, vous avez plusieurs options.
La première et la plus basique est l'utilisation de SQLite. SQLite est une base de données basée sur SQL, pensée pour le mobile et du coup plus légère. Via une API en langage C, vous rédigez directement vos requêtes SQL.
Le langage C ? Mais je fais du Swift, moi !
Oui, je C... ça ne fait pas rêver ! Malgré tout, on peut interagir via des API en Swift, mais ça reste proche du SQL et pas forcément très pratique pour une grosse base de données.
C'est la raison pour laquelle il existe des alternatives. La plus répandue se nomme Core Data. C'est une base de données SQL avec une API orientée objet.
En français, cela signifie que vous avez une base de données SQL standard (souvent SQLite) que vous ne manipulez pas directement. À la place, vous manipulez directement des objets Swift. Vous travaillez donc en orienté objet, et toute la complexité SQL est gérée à votre place par le framework.
En plus, comme c'est un framework d'Apple, il s'intègre extrêmement bien avec le reste de l'écosystème, que ce soit Xcode, Cocoa Touch ou d'autres frameworks.
CloudKit / Firebase / Realm
Enfin, si vous voulez aller encore plus loin, vous avez les technologies que l'on regroupe sous le nom de MBaaS, pour Mobile Back-end As A Service. Ce sont des bases de données dans le cloud qui s'intègrent très facilement et qui gèrent pour vous beaucoup de choses compliquées, comme :
Installer / gérer / mettre à l'échelle un serveur.
Gérer les problèmes de connexion réseau.
Gérer la sécurité de vos appels réseau.
Et un certain nombre d'autres choses.
Il existe de nombreuses solutions sur le marché, mais je vous présente les trois plus populaires.
CloudKit
CloudKit est la solution maison d'Apple. Elle est assez facile à mettre en place et comme tout ce que fait Apple, elle est extrêmement bien connectée au reste de l'écosystème Apple. Donc si votre produit se destine exclusivement à des utilisateurs d'iPhone / iPad / Apple TV / Mac et autres Apple Watch, je vous recommande fortement de jeter un œil à cette technologie.
La contrepartie, c'est que CloudKit n'est pas très adapté au Web ou à Android. C'est faisable, mais ce n'est vraiment pas pratique. Donc si vous faites une application pour iOS et Android, je ne recommande pas CloudKit.
Firebase
Firebase est le concurrent de CloudKit chez Google. Cette technologie est extrêmement puissante, et je pense qu'elle est d'assez loin la plus répandue des MBaaS. Elle s'adapte très bien à iOS, Android et au Web.
On a même un cours Créez un backend scalable et performant sur Firebase.
Firebase est une base de données dans le cloud, accessible en temps réel. Cela veut dire que vous ne faites plus de requêtes pour récupérer des données. L'application écoute la base de données et reçoit les modifications de la base de données dès que celle-ci est modifiée. C'est extrêmement pratique, et cela donne une expérience utilisateur de premier plan !
Ce n’est pas tout, Firebase ne permet pas uniquement d'accéder à une base de données en ligne. Elle gère énormément de choses pour vous : l'authentification via différents services comme Facebook ou Google, le mode hors ligne, les notifications et beaucoup d'autres choses.
Vous vous devez d'y jeter un œil !
Je vous conseille en particulier ce tutoriel pour démarrer.
Realm
L'entreprise Realm est spécialisée dans la gestion des données sur mobile. Cette technologie disponible sur Android et iOS permet une gestion très simple des données sur le mobile.
La particularité de Realm est d'être une solution de base de données en local à la fois sur le téléphone et dans le cloud. En effet, vous pouvez souscrire à leur offre de plateforme et avoir un équivalent de Firebase, ou alors vous pouvez utiliser leur technologie de base de données open source (donc gratuite !) et utiliser Realm à la place de Core Data pour vos données en local.
Realm est une très bonne alternative à Core Data, à tel point que j'ai hésité à faire ce cours sur Realm plutôt que sur Core Data. Je vous incite fortement à regarder ça de près.
Vous pouvez trouver une bonne introduction à Realm ici.
Appréhendez la limite de la persistance
Maintenant qu'on a parlé des différentes techniques de persistance et de leurs particularités, je voudrais finir avec une règle très importante de la persistance sur iOS :
Toutes les données que vous stockez sur l'iPhone restent dans le périmètre de l'application.
En gros, sur iOS, chaque application évolue dans un compartiment unique, séparé des autres.
On parle en anglais de sandbox (bac à sable).
Donc lorsque vous créez une base de données ou que vous sauvegardez un fichier, vous faites ça dans votre compartiment.
Il n'est pas question d'aller manipuler les données d'une autre application.
Apple a imposé cela pour trois raisons :
Sécurité : Vous ne voulez pas qu'une application malveillante vienne s'immiscer dans vos données pour les modifier et altérer le fonctionnement de votre app.
Vie privée : Les données que vous collectez appartiennent à votre utilisateur, et aucune autre application ne doit pouvoir y accéder.
Nettoyage : Lorsque l'application est supprimée par l'utilisateur, toutes les données qui vont avec peuvent être supprimées aussi d'un seul coup, car elles font partie du même package. Il n'y a pas d'autres données à aller chercher un peu partout dans le téléphone.
Bref, chacun son bac à sable et les données seront bien gardées !
Évidemment, je parle ici uniquement des données en local. Les données envoyées vers un serveur ou un cloud quittent par définition le téléphone et donc l'application.
En résumé
La persistance désigne l'ensemble des techniques qui permettent de stocker des données sur votre iPhone.
Il existe plusieurs techniques de persistance :
Techniquement, la persistance permet d’enregistrer des informations sur un support physique, comme un disque ou un SSD.
Les UserDefaults sont tout simplement un dictionnaire (clé-valeur) qui persiste.
Unix File System et UIDocument sont deux techniques de persistance qui s’appuient sur des fichiers.
SQLite est une base de données basée sur SQL, pensée pour le mobile et donc plus légère.
CoreData est une base de données SQL avec une API orientée objet.
Le groupe des MBaaS pour “Mobile Back-End As A Service” correspond aux bases de données dans le cloud.
Toutes les données stockées sur l’iPhone restent dans le périmètre de l’application.
Dans le prochain chapitre, nous allons nous plonger dans le code de notre application Cekikapeye !