Students Save 30%! Learn & create with unlimited courses & creative assets Students Save 30%! Save Now
Advertisement
  1. Code
  2. CloudKit
Code

Création d'une application de liste d'achats avec CloudKit: introduction

by
Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called Building a Shopping List Application With CloudKit.
Building a Shopping List Application With CloudKit: Adding Records

French (Français) translation by Soleil (you can also view the original English article)

En 2012, Apple a lancé iCloud aux côtés d'iOS 5. Parallèlement, la société a annoncé que les développeurs auraient accès à iCloud via un certain nombre d'API. Au début, les développeurs avaient trois options:

Ces API ne sont cependant pas parfaites. Leur manque de transparence est une lacune majeure. L'intégration des données de base, en particulier, a suscité la frustration et la confusion chez les développeurs les plus expérimentés. Lorsque quelque chose ne va pas, les développeurs n’ont aucune idée de ce qu’est le coupable. Cela pourrait être un problème dans leur code ou dans celui d’Apple.

CloudKit

Lors de la WWDC 2014, Apple a présenté CloudKit, un tout nouveau framework qui interagit directement avec les serveurs iCloud d'Apple. Le cadre est comparable à un certain nombre de solutions PaaS (Platform as a Service), telles que Firebase. À l'instar de Firebase, Apple fournit une API flexible et un tableau de bord qui offre aux développeurs un aperçu des données stockées sur les serveurs iCloud d'Apple.

Ce que j'aime le plus chez CloudKit, c'est le propre engagement d'Apple dans ce domaine. Selon la société, iCloud Drive et iCloud Photo Library sont construits sur CloudKit. Cela montre que le framework CloudKit et son infrastructure sont robustes et fiables.

En tant que développeur, ce signe de confiance et d’engagement est important. Par le passé, Apple publiait occasionnellement des API qui étaient en proie à des bogues ou manquaient de fonctionnalités clés simplement parce que l'entreprise ne mangeait pas ses propres aliments pour chiens. Ce n'est pas vrai pour CloudKit. Et c'est prometteur.

Devriez-vous utiliser CloudKit?

Le stockage de valeurs-clés et le stockage de documents ont leur utilité, et Apple souligne que CloudKit ne remplace ni ne désapprouve les API iCloud existantes. La même chose est vraie pour les données de base. CloudKit n'offre pas de stockage local, par exemple. Cela signifie qu'une application exécutée sur un périphérique sans connexion réseau est pratiquement inutile si elle repose uniquement sur CloudKit.

Apple souligne également que la gestion des erreurs est essentielle lorsque vous travaillez avec CloudKit. Si une opération de sauvegarde échoue, par exemple, et que l'utilisateur n'est pas averti, elle peut même ne pas savoir que ses données n'ont pas été enregistrées et perdues.

CloudKit est une excellente solution pour stocker des données structurées et non structurées dans le cloud. Si vous avez besoin d'une solution pour accéder aux données sur plusieurs périphériques, CloudKit est certainement une option à envisager.

À la WWDC 2015, Apple a fait ce que peu de développeurs attendaient ou espéraient. Il a annoncé un service Web pour CloudKit. Cela signifie que CloudKit peut être utilisé sur pratiquement toutes les plates-formes, y compris Android et Windows Phone.

Les prix d'Apple sont également très compétitifs. Démarrer avec CloudKit est gratuit et reste gratuit pour la plupart des applications. Encore une fois, CloudKit est certainement utile si vous prévoyez de stocker des données dans le cloud.

Concepts CloudKit

Les développeurs aux prises avec des données de base ne sont souvent pas familiarisés avec les éléments constitutifs du framework. Si vous ne prenez pas le temps d'apprendre et de comprendre la pile de données de base, vous rencontrerez inévitablement des problèmes. La même chose est vraie pour CloudKit.

Avant de commencer à travailler sur un exemple d'application utilisant CloudKit, je souhaite passer quelques minutes à vous présenter un certain nombre de concepts clés de l'infrastructure et de l'infrastructure CloudKit. Commençons par les conteneurs, les bases de données et le sandboxing.

Confidentialité et confinement

Apple explique très clairement que la confidentialité est un aspect important de CloudKit. La première chose à savoir est que chaque application a son propre conteneur dans iCloud. Ce concept est très similaire à la façon dont les applications iOS possèdent chacune leur propre sandbox. Cependant, il est possible de partager un conteneur avec d'autres applications tant que ces applications sont associées au même compte de développeur. Comme vous pouvez l'imaginer, cela ouvre un certain nombre de possibilités intéressantes aux développeurs.

Un conteneur CloudKit contient plusieurs bases de données. Chaque conteneur possède une base de données publique pouvant être utilisée pour stocker des données accessibles à chaque utilisateur de votre application. Outre la base de données publique, un conteneur contient également une base de données privée pour chaque utilisateur de votre application. La base de données privée de l'utilisateur est utilisée pour stocker des données spécifiques à cet utilisateur. La ségrégation et l'encapsulation des données sont des composants clés de l'infrastructure CloudKit et iCloud.

Même si le conteneur d'une application peut contenir de nombreuses bases de données, du point de vue d'un développeur, un conteneur ne contient que deux bases de données: public database et private database de l'utilisateur actuellement connecté à son compte iCloud. À partir de 2017, Apple a introduit une troisième base de données, shared database, offrant aux applications la possibilité de partager un sous-ensemble d'enregistrements partagés sur la base de données privée d'un autre utilisateur, les invitant à contribuer à ces enregistrements exposés.

diagram of public private and shared databases

Je parlerai un peu plus des comptes iCloud un peu plus tard.

Zones d'enregistrement et d'enregistrement

Les bases de données des enregistrements du magasin de l'application. Ce n'est pas très différent d'une base de données traditionnelle. À première vue, les enregistrements stockés dans une base de données CloudKit ne semblent être que des enveloppes pour un dictionnaire de paires clé-valeur. Ils peuvent ressembler à des dictionnaires glorifiés, mais ce n'est qu'une partie de l'histoire.

Chaque enregistrement a également un record type et un certain nombre de champs metadata. Les métadonnées d'un enregistrement permettent de savoir quand l'enregistrement a été créé, quel utilisateur a créé l'enregistrement, quand l'enregistrement a été mis à jour pour la dernière fois et qui a mis à jour l'enregistrement.

La classe CKRecord représente un tel enregistrement, et c'est une classe assez puissante. Les valeurs que vous pouvez stocker dans un enregistrement ne sont pas limitées aux types de liste de propriétés. Vous pouvez stocker des chaînes, des nombres, des dates et des blobs de données dans un enregistrement, mais la classe CKRecord traite également les données d'emplacement, CLLocation, comme un type de données de première classe.

Vous pouvez même stocker des tableaux des types de données pris en charge dans un enregistrement. En d'autres termes, les tableaux de chaînes ou de nombres ne posent aucun problème pour une instance de CKRecord.

Les enregistrements sont organisés en zones d'enregistrement. Une zone d'enregistrement groupe les enregistrements associés. La base de données publique et la base de données privée ont chacune une zone d’enregistrement par défaut, mais il est possible de créer des zones d’enregistrement personnalisées si nécessaire. Les zones d'enregistrement sont un sujet avancé dont nous ne discuterons pas en détail dans cette série.

Des relations

Les relations entre les enregistrements sont gérées par des instances de la classe CKReference. Examinons un exemple pour mieux comprendre comment fonctionnent les relations. L'application que nous allons créer dans cette série va gérer un certain nombre de listes de courses. Chaque liste peut contenir zéro ou plusieurs éléments. Cela signifie que chaque élément doit avoir une référence à la liste à laquelle il appartient.

diagram of shopping list and items

Il est important de comprendre que l'élément conserve une référence à la liste. Bien qu'il soit possible de créer un tableau d'instances CKReference pour les éléments d'une liste, il est plus pratique, et recommandé, de conserver la clé étrangère avec l'élément, pas la liste. C'est également ce que recommande Apple.

La façon dont CloudKit gère les relations est assez simple, mais elle fournit une option pour supprimer automatiquement les enfants d'un enregistrement lorsque l'enregistrement parent est supprimé. Nous allons examiner de plus près les relations un peu plus tard dans cette série.

Les atouts

Je voudrais également mentionner la classe CKAsset. Bien qu'il soit possible de stocker des gouttes de données dans un enregistrement, les données non structurées (telles que les images, l'audio et la vidéo) doivent être stockées en tant qu'instances CKAsset. Une instance CKAsset est toujours associée à un enregistrement et correspond à un fichier sur le disque. Nous ne travaillerons pas avec la classe CKAsset de cette série.

Authentification

Je suis sûr que vous êtes d'accord que CloudKit a l'air très attrayant. Il y a cependant un détail important dont nous n'avons pas encore parlé: l'authentification. Les utilisateurs s’authentifient via leurs comptes iCloud. Les utilisateurs qui ne sont pas connectés à un compte iCloud ne peuvent pas écrire de données sur iCloud.

Bien que cela soit vrai pour toutes les API iCloud, gardez à l'esprit que les applications qui reposent uniquement sur CloudKit ne seront pas très fonctionnelles dans ce cas. Tout ce que l'utilisateur peut faire est d'accéder aux données de la base de données publique, si le développeur le permet.

Lecture des données

Les utilisateurs qui ne sont pas connectés à leurs comptes iCloud peuvent toujours lire les données de la base de données publique. Il va sans dire que la base de données privée n'est pas accessible car iCloud ne sait pas qui utilise l'application.

Lire et écrire

Une fois connecté, les utilisateurs peuvent lire et écrire au public et à leur base de données privée. J'ai déjà mentionné qu'Apple prend la confidentialité très au sérieux. Par conséquent, les enregistrements stockés dans la base de données privée ne sont accessibles que par l'utilisateur. Même vous, le développeur, ne pouvez pas voir les données stockées par les utilisateurs dans leurs bases de données privées. C'est l'inconvénient qu'Apple gère le back-end de votre application, mais c'est une victoire certaine pour l'utilisateur.

Liste de courses

L'application que nous allons construire va gérer vos listes de courses. Chaque liste de courses aura un nom et zéro ou plusieurs articles. Après avoir créé l'application de liste d'achats, vous devriez vous sentir à l'aise d'utiliser le framework CloudKit dans un projet qui vous est propre.

Conditions préalables

Pour ce tutoriel, j'utiliserai Xcode 9 et Swift 4. Si vous utilisez une ancienne version de Xcode, gardez à l'esprit que vous utilisez une version différente du langage de programmation Swift. Cela signifie que vous devrez mettre à jour le code source du projet pour satisfaire le compilateur. Les changements sont pour la plupart mineurs, mais il est important d'en être conscient.

CloudKit étant un sujet avancé, je suppose que vous êtes familier avec Xcode et le langage de programmation Swift. Si vous débutez dans le développement iOS, je vous recommande d'abord de lire un didacticiel d'introduction ou de suivre l'un de nos cours sur le développement de Swift:

Assurez-vous de les vérifier si vous êtes nouveau sur le développement iOS ou le langage Swift.

Configuration du projet

Il est temps de commencer à écrire du code. Lancez Xcode et créez un nouveau projet basé sur le modèle Single View Application.

Choose the Single View Application template

Donnez un nom et un identifiant à votre projet. L'identifiant de regroupement résultant sera utilisé pour créer l'identificateur du conteneur par défaut de votre application. Cet identifiant doit être unique sur les comptes de développeur car ils partagent un espace de noms global. Il est donc important de suivre les conseils d'Apple et d'utiliser la notation inversée des noms de domaine.

Configure the project

Activation d'iCloud

L'étape suivante consiste à activer iCloud et CloudKit. Sélectionnez le projet dans Project Navigator sur la gauche et sélectionnez la cible de votre application dans la liste des cibles. Ouvrez l'onglet General et définissez Team sur la bonne équipe. Pour éviter tout problème à l'étape suivante, vérifiez que votre compte de développeur dispose des autorisations requises pour créer un App ID.

Select the correct team

Ensuite, ouvrez l'onglet Capabilities en haut et définissez le commutateur sur iCloud sur on. Xcode aura besoin d'un instant pour créer un App ID en votre nom. Il ajoutera également les droits nécessaires à l'App ID. Si cela ne fonctionne pas, assurez-vous que l'équipe est correctement définie et que vous disposez des autorisations requises pour créer un App ID.

Enable iCloud

Activer CloudKit est aussi simple que de cocher la case intitulée CloudKit. Par défaut, votre application utilisera le conteneur par défaut pour votre application. Ce conteneur est automatiquement créé pour vous lorsque vous activez CloudKit.

Si votre application a besoin d'accéder à un autre conteneur ou à plusieurs conteneurs, cochez la case intitulée Specify custom containers et vérifiez les conteneurs auxquels votre application doit accéder.

Enable custom containers

Vous avez peut-être remarqué que Xcode a automatiquement lié votre cible au framework CloudKit. Cela signifie que vous êtes prêt à utiliser CloudKit dans votre application.

Obtenir vos pieds mouillés

Dans le prochain tutoriel de cette série, nous ajouterons la possibilité d’ajouter, de modifier et de supprimer des listes de courses. Pour terminer ce tutoriel, je voudrais toutefois vous familiariser avec l’interaction avec l’API CloudKit. Tout ce que nous allons faire, c'est récupérer l'enregistrement de l'utilisateur actuellement connecté.

Ouvrez ViewController.swift et ajoutez une instruction d'importation en haut pour importer le framework CloudKit.

Pour récupérer l'enregistrement de l'utilisateur, nous devons d'abord récupérer l'identifiant de l'enregistrement. Voyons comment cela fonctionne. J'ai créé une méthode d'assistance, fetchUserRecordID, pour contenir la logique d'extraction de l'identifiant d'enregistrement de l'utilisateur. Nous appelons cette méthode dans la méthode viewDidLoad du contrôleur de vue.

L'implémentation de fetchUserRecordID est un peu plus intéressante que viewDidLoad. Nous récupérons d'abord une référence au conteneur par défaut de l'application en appelant defaultContainer sur la classe CKContainer. Nous appelons alors fetchUserRecordIDWithCompletionHandler (_ :) sur defaultContainer. Cette méthode accepte une fermeture comme seul argument.

La fermeture accepte deux arguments: une instance facultative de CKRecordID et une instance facultative de NSError. Si error est nil, nous déballons en toute sécurité recordID.

Il est important de souligner que la fermeture sera appelée sur un thread d'arrière-plan. Cela signifie que vous devez faire attention lors de la mise à jour de l'interface utilisateur de votre application à partir d'une fermeture appelée par CloudKit. Dans fetchUserRecordID, par exemple, j'appelle explicitement fetchUserRecord(_:) sur le thread principal.

Dans fetchUserRecord(_ :), nous récupérons l'enregistrement utilisateur en indiquant à CloudKit l'enregistrement qui nous intéresse. Notez que nous appelons fetchRecordWithID(_:completionHandler:) sur l'objet privateDatabase, une propriété de l'objet defaultContainer.

La méthode accepte une instance CKRecordID et un gestionnaire d'achèvement. Ce dernier accepte une instance facultative de CKRecord et une instance de NSError. Si nous avons correctement récupéré l'enregistrement de l'utilisateur, nous l'imprimons dans la console de Xcode.

Lorsque vous exécutez l'application dans Xcode, vous verrez dans la console quelque chose de similaire à:

Code output in console

Cela aurait dû vous donner un aperçu du framework CloudKit. Son API moderne est intuitive et facile à utiliser. Dans le prochain tutoriel, nous approfondirons les possibilités de l’API CloudKit.

Vous pouvez cloner l'intégralité du projet exemple sur GitHub (tag #introduction).

Conclusion

Vous devriez maintenant avoir une compréhension correcte des bases du framework CloudKit. Le reste de cette série sera axé sur la création de l'application de liste d'achats. Dans le prochain tutoriel, nous commencerons par ajouter la possibilité d’ajouter, de modifier et de supprimer des listes de courses.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.