Maybaygiare.org

Blog Network

Tutoriel CocoaPods pour Swift: Mise en route

Note de mise à jour: Rony Rozen a mis à jour ce tutoriel pour Xcode 11 et Swift 5. Joshua Greene a écrit l’original.

CocoaPods est un gestionnaire de dépendances populaire pour les projets Swift et Objective-C Cocoa. Des milliers de bibliothèques et des millions d’applications l’utilisent, selon le site CocoaPods. Mais qu’est-ce qu’un gestionnaire de dépendances et pourquoi en avez-vous besoin ?

Un gestionnaire de dépendances facilite l’ajout, la suppression, la mise à jour et la gestion des dépendances tierces utilisées par votre application.

Par exemple, au lieu de réinventer votre propre bibliothèque réseau, vous pouvez facilement extraire Alamofire à l’aide d’un gestionnaire de dépendances. Vous pouvez spécifier la version exacte à utiliser ou une plage de versions acceptables.

Cela signifie que même si Alamofire reçoit une mise à jour avec des modifications qui ne sont pas rétrocompatibles, votre application peut continuer à utiliser l’ancienne version jusqu’à ce que vous soyez prêt à la mettre à jour.

Dans ce tutoriel, vous apprendrez à utiliser les CocoaPods avec Swift. Plus précisément, vous allez :

  • Installer des CocoaPods.
  • Travaillez avec une application de démonstration fonctionnelle qui vous fait penser à la crème glacée.
  • Utilisez les CocoaPods pour ajouter du réseau.
  • En savoir plus sur le versionnage sémantique.
  • Ajoutez une autre bibliothèque en utilisant une version flexible.
Remarque: Ce tutoriel CocoaPods nécessite une familiarité de base avec iOS et le développement Swift. Si vous êtes complètement nouveau sur iOS et / ou Swift, veuillez consulter certains des autres tutoriels écrits et / ou vidéo sur ce site avant de faire ce tutoriel. Ou, plongez dans notre livre, Apprenti iOS.

Ce tutoriel comprend également des classes qui utilisent des graphiques de base. Bien que la connaissance des graphiques de base soit bénéfique, elle n’est pas requise. Si vous souhaitez en savoir plus, lisez nos graphiques de base modernes Avec la série Swift.

Mise en route

Téléchargez le projet de démarrage en cliquant sur le bouton Télécharger les matériaux en haut ou en bas du tutoriel.Tout au long de ce tutoriel, vous travaillerez avec une application appelée Ice Cream Shop, Inc. Vous utiliserez CocoaPods pour ajouter facilement des dépendances à l’application, au lieu d’écrire les vôtres.

Avant de pouvoir poursuivre ce tutoriel, vous devez installer CocoaPods. Heureusement, CocoaPods utilise Ruby, qui est livré avec toutes les versions de macOS X depuis la version 10.7.

Ouvrez Terminal et entrez la commande suivante:

sudo gem install cocoapods

Entrez votre mot de passe sur demande. La sortie du terminal affichera diverses sorties liées à la récupération, à l’installation et à la documentation, en terminant par « XX gemmes installées”.

Remarque: Vous devez utiliser sudo pour installer les CocoaPods, mais une fois qu’il est installé, vous n’aurez plus besoin de l’utiliser dans ce tutoriel.

Enfin, entrez cette commande dans le Terminal pour terminer la configuration:

pod setup --verbose

Ce processus prend quelques minutes car il clone le référentiel de spécifications maître CocoaPods en ~/.cocoapods / sur votre ordinateur.

L’option verbose enregistre la progression au fur et à mesure que le processus s’exécute, vous permettant de regarder le processus au lieu de voir un écran apparemment « gelé”.

Génial, vous êtes maintenant prêt à utiliser des CocoaPods !

Magasin de crème glacée, Inc.

Votre client principal est Ice Cream Shop, Inc. Leur crème glacée est si populaire qu’ils ne peuvent pas suivre les commandes des clients au comptoir. Ils vous ont recruté pour créer une application iOS élégante qui permet aux clients de commander des glaces directement depuis leur iPhone.

Vous avez commencé à développer l’application et elle arrive bien. Jetez un coup d’œil à vos progrès en ouvrant IceCreamShop.xcodeproj, puis construire et courir. Vous verrez un cornet de crème glacée à la vanille appétissant:

Ice Cream Shop, Inc.Page de démarrage de ''s start page

L’utilisateur devrait pouvoir choisir une saveur de crème glacée à partir de cet écran, mais ce n’est pas encore possible. Votre première étape consiste à terminer l’implémentation de cette fonctionnalité.

Ouvrir la main.storyboard from the Views/Storyboards & Groupe Nibs pour voir la mise en page de l’application. Voici un aperçu rapide du cœur de l’application, la scène Choisissez votre saveur:

Composants de la scène Choisissez votre saveur

  • PickFlavorViewController est le contrôleur de vue pour cette scène. Il gère l’interaction de l’utilisateur et fournit les données pour la vue de collection qui affiche les différentes saveurs de crème glacée.
  • IceCreamView est une vue personnalisée qui affiche un cornet de crème glacée basé sur le mode de sauvegarde, Flavor.
  • ScoopCell est une cellule de vue de collection personnalisée qui contient un ScoopView, qui obtient les couleurs d’un modèle Flavor.

Alors que chaque magasin de crème glacée, Inc. l’emplacement a des saveurs de signature en commun, chacun porte ses propres saveurs locales, aussi. Pour cette raison, un service Web doit fournir les données pour les Flavor s.

Cependant, cela n’explique toujours pas pourquoi les utilisateurs ne peuvent pas sélectionner leurs saveurs de crème glacée.

Ouvrez PickFlavorViewController.swift, trouvé sous le groupe Controllers, et vous verrez une méthode tronquée:

private func loadFlavors() { // TO-DO: Implement this}

Aha, il n’y a pas de saveurs! Vous devez implémenter la fonction!

Bien que vous puissiez utiliser URLSession et écrire vos propres classes de mise en réseau, il existe un moyen plus simple: Utilisez Alamofire!

Vous pourriez être tenté de télécharger cette bibliothèque et de faire glisser les fichiers source directement dans votre projet. Cependant, ce serait le faire à la dure. CocoaPods offre une solution beaucoup plus élégante et agile.

Installation de votre première dépendance

Votre première étape consiste à fermer Xcode. Ouais, tu as bien lu ça.

Il est temps de créer le Podfile, où vous définirez les dépendances de votre projet.

Ouvrez Terminal et accédez au répertoire qui contient votre projet IceCreamShop en utilisant la commande cd:

cd ~/Path/To/Folder/Containing/IceCreamShop

Ensuite, entrez la commande suivante:

pod init

Cela crée un Podfile pour votre projet.

Enfin, tapez la commande suivante pour ouvrir le Podfile en utilisant Xcode pour l’édition:

open -a Xcode Podfile
Remarque: N’utilisez pas TextEdit pour éditer le Podfile car il remplace les guillemets standard par des guillemets de composition plus attrayants graphiquement. Cela peut rendre les cocoapodes confus et générer des erreurs. Utilisez plutôt Xcode ou un autre éditeur de texte de programmation pour modifier votre Podfile.

Le Podfile par défaut ressemble à ceci:

# Uncomment the next line to define a global platform for your project# platform :ios, '9.0'target 'IceCreamShop' do # Comment the next line if you're not using Swift and don't want to use dynamic frameworks use_frameworks! # Pods for IceCreamShopend

Supprimez le # et l’espace avant platform, puis supprimez les autres lignes commençant par #.

Votre Podfile devrait maintenant ressembler à ceci:

platform :ios, '9.0'target 'IceCreamShop' do use_frameworks!end

Cela indique à CocoaPods que votre projet cible iOS 9.0 et utilisera des frameworks au lieu de bibliothèques statiques. Alors que Swift et CocoaPods prennent tous deux en charge la liaison statique, toutes les bibliothèques que vous incluez ne le font pas. L’un d’eux que vous utiliserez dans ce projet ne le fait pas.

Si vous n’avez programmé que dans Swift, cela peut sembler un peu étrange. C’est parce que le Podfile est en fait écrit en Ruby. Vous n’avez pas besoin de connaître Ruby pour utiliser les CocoaPods, mais sachez que même des erreurs de texte mineures provoqueront des erreurs CocoaPods.

Un mot Sur les bibliothèques

Vous verrez le terme bibliothèque souvent utilisé comme un terme général qui signifie en fait une bibliothèque ou un framework. Ce tutoriel est également coupable de mélanger ces mots avec désinvolture.

Vous vous interrogez peut-être sur les différences entre une bibliothèque, un framework et un CocoaPod. Ce n’est pas grave si vous trouvez la terminologie un peu déroutante!

Un CocoaPod, ou pod en abrégé, est un terme général désignant une bibliothèque ou un framework ajouté à votre projet à l’aide de CocoaPods.

iOS 8 a introduit des frameworks dynamiques, qui vous permettent de regrouper du code, des images et d’autres ressources. Avant iOS 8, vous créiez des CocoaPods en tant que bibliothèques statiques ”fat ». « Fat » signifie qu’ils contenaient plusieurs jeux d’instructions de code, comme i386 pour le simulateur, armv7 pour les appareils, etc. Cependant, Swift n’autorise pas les bibliothèques statiques à contenir des ressources telles que des images ou des ressources.

Retour à l’installation de Votre Première Dépendance

Il est enfin temps d’ajouter votre première dépendance à l’aide de CocoaPods. Ajoutez ce qui suit à votre Podfile, juste après use_frameworks!:

pod 'Alamofire', '4.9.1'

Cela indique à CocoaPods que vous souhaitez inclure Alamofire version 4.9.1 comme dépendance pour votre projet.

Enregistrez et fermez le Podfile.

Vous devez maintenant dire à CocoaPods d’installer les dépendances pour votre projet.

Entrez la commande suivante dans Terminal, après vous être assuré que vous êtes toujours dans le répertoire contenant le projet IceCreamShop et le Podfile:

pod install

Vous devriez voir une sortie comme celle-ci:

Analyzing dependenciesAdding spec repo `trunk` with CDN `https://cdn.cocoapods.org/`Downloading dependenciesInstalling Alamofire (4.9.1)Generating Pods projectIntegrating client project Please close any current Xcode sessions and use `IceCreamShop.xcworkspace` for this project from now on.Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.

Ouvrez le dossier du projet à l’aide du Finder et vous verrez que CocoaPods a créé un nouveau IceCreamShop.fichier xcworkspace et un dossier Pods pour stocker toutes les dépendances du projet.

Remarque: À partir de maintenant, comme l’avertissement de ligne de commande l’a mentionné, vous devez toujours ouvrir le projet avec le.fichier xcworkspace et non le .xcodeproj. Sinon, vous rencontrerez des erreurs de génération.

Excellent! Vous venez d’ajouter votre première dépendance à l’aide de CocoaPods !

En utilisant les Pods installés

Maintenant, vous utiliserez votre toute nouvelle dépendance, Alamofire.

Si le projet Xcode est ouvert, fermez-le maintenant et ouvrez IceCreamShop.espace de travail xc.

Ouvrez PickFlavorViewController.swift et ajoutez ce qui suit juste en dessous de l’importation existante:

import Alamofire

Créez et exécutez. Vous ne verrez pas encore de changement, mais soyez assuré que Alamofire est maintenant disponible.

Première compilation après l'intégration de la dépendance Alamofire

Ensuite, remplacez loadFlavors() par ce qui suit:

 private func loadFlavors() { // 1 Alamofire.request( "https://www.raywenderlich.com/downloads/Flavors.plist", method: .get, encoding: PropertyListEncoding(format: .xml, options: 0)) .responsePropertyList { response in // 2 guard let self = self else { return } // 3 guard response.result.isSuccess, let dictionaryArray = response.result.value as? ] else { return } // 4 self.flavors = self.flavorFactory.flavors(from: dictionaryArray) // 5 self.collectionView.reloadData() self.selectFirstFlavor() } }

Voici le jeu par jeu de ce qui se passe dans ce code:

  1. Vous utilisez Alamofire pour créer une demande GET et télécharger une liste contenant des arômes de crème glacée.
  2. Pour briser un cycle de référence fort, vous utilisez une référence faible à self dans le bloc d’achèvement de la réponse. Une fois le bloc exécuté, vous obtenez immédiatement une référence forte à self afin que vous puissiez définir des propriétés plus tard.
  3. Ensuite, vous vérifiez que response.result affiche le succès et que response.result.value est un tableau de dictionnaires.
  4. Maintenant, vous définissez self.flavors sur un tableau d’objets Flavor créés par FlavorFactory. Ceci est une classe qu’un ”collègue » a écrite pour vous (vous êtes les bienvenus!), qui prend un tableau de dictionnaires et les utilise pour créer des instances de Flavor.
  5. Enfin, vous rechargez la vue collection et sélectionnez la première saveur.

Construire et exécuter. Vous pouvez maintenant choisir une saveur de crème glacée!

Choisissez la saveur

Maintenant pour une garniture savoureuse

L’application a l’air bien, mais vous pouvez toujours l’améliorer.

Avez-vous remarqué que l’application prend une seconde pour télécharger le fichier flavors? Si vous êtes sur une connexion Internet rapide, vous ne remarquerez peut-être pas le retard, mais vos clients ne seront pas toujours aussi chanceux.

Votre prochaine étape consiste à afficher un indicateur de chargement dans votre application, pour aider les clients à comprendre qu’elle charge des données et non pas seulement ses bibliothèques. MBProgressHUD est un très bon indicateur qui fonctionnera bien ici. Et il prend en charge les CocoaPods; quelle coïncidence ! :]

Pour utiliser ce pod, vous devez l’ajouter à votre Podfile. Plutôt que d’ouvrir le Podfile depuis la ligne de commande, vous pouvez maintenant le trouver dans la cible des Pods dans l’espace de travail :

Pods dans l'espace de travail

Ouvrez le Podfile et ajoutez ce qui suit, juste après la ligne Alamofire:

pod 'MBProgressHUD', '~> 1.0'

Enregistrez le fichier et installez les dépendances via pod install dans le terminal, comme avant.

Remarquez quelque chose de différent cette fois? Oui, vous avez spécifié le numéro de version comme ~> 1.0. Mais pourquoi?

CocoaPods recommande que tous les pods utilisent le Versionnage sémantique. Prenez un moment pour comprendre ce que c’est.

Versioning sémantique

Plusieurs fois, vous verrez une version écrite comme ceci : 1.0.0. Ces trois numéros sont des numéros de version majeurs, mineurs et correctifs.

Par exemple, pour le numéro de version 1.0.0, 1 est le nombre majeur, le premier 0 est le nombre mineur et le second 0 est le numéro de patch.

Exemple de version sémantique

Si le nombre principal augmente, cela indique que la version contient des modifications non rétrocompatibles. Lorsque vous mettez à niveau un pod vers la prochaine version majeure, vous devrez peut-être corriger des erreurs de génération ou le pod peut se comporter différemment qu’auparavant.

Si le nombre mineur augmente, cela indique que la version contient de nouvelles fonctionnalités rétrocompatibles. Lorsque vous décidez de mettre à niveau, vous pouvez avoir besoin ou non de la nouvelle fonctionnalité, mais cela ne devrait pas provoquer d’erreurs de génération ni modifier le comportement existant.

Si le numéro de correctif augmente, cela signifie que la nouvelle version contient des corrections de bugs mais aucune nouvelle fonctionnalité ou changement de comportement. En général, vous souhaitez toujours mettre à niveau les versions de correctifs dès que possible pour disposer de la dernière version stable du pod.

Enfin, lorsque vous augmentez le numéro d’ordre le plus élevé – majeur, puis mineur puis patch — selon les règles ci—dessus, vous devez réinitialiser tous les numéros d’ordre inférieur à zéro.

Voici un exemple :

Considérons un pod dont le numéro de version actuel est 1.2.3.

Si vous apportez des modifications qui ne sont pas rétrocompatibles, n’avez pas de nouvelles fonctionnalités, mais corrigez les bogues existants, vous lui donneriez la version 2.0.0.

Temps de défi

Si un pod a une version actuelle de 2.4.6 et vous apportez des modifications qui corrigent les bugs et ajoutent des fonctionnalités rétrocompatibles, quel devrait être le nouveau numéro de version?

Réponse: 2.5.0
Explication: Si vous apportez des modifications qui incluent de nouvelles fonctionnalités rétrocompatibles, vous augmentez le nombre mineur et réinitialisez le correctif à zéro.

Si un pod a une version actuelle de 3.5.8 et que vous apportez des modifications aux fonctionnalités existantes qui ne sont pas rétrocompatibles, quel devrait être le nouveau numéro de version ?

Réponse: 4.0.0
Explication: Si les modifications modifient le comportement existant et ne sont pas rétrocompatibles, vous devez augmenter le nombre majeur et réinitialiser les numéros mineur et de correctif à zéro.

Si un pod a une version actuelle de 10.20.30 et que vous ne corrigez que des bugs, quel devrait être le nouveau numéro de version ?

Réponse: 10.20.31
Explication: Si vous ne corrigez que des bogues, vous augmentez seulement le numéro de patch.

Ceci dit, il y a une exception à ces règles :

Si le numéro de version d’un pod est inférieur à 1.0.0, il est considéré comme une version bêta. Les augmentations mineures du nombre peuvent inclure des modifications qui ne sont pas rétrocompatibles.

Revenons donc à MBProgressHUB: En utilisant ~> 1.0 signifie que vous devez installer la dernière version supérieure ou égale à 1.0 mais inférieure à 2.0.

Cela vous garantit d’obtenir les dernières corrections de bugs et fonctionnalités lors de l’installation de ce pod, mais vous ne récupérerez pas accidentellement les modifications incompatibles avec l’arrière.

Il existe plusieurs autres opérateurs que vous pouvez également utiliser. Pour une liste complète, consultez la référence de syntaxe du Podfile.

Maintenant que vous avez appris comment les opérateurs fonctionnent avec vos CocoaPods, il est temps de terminer votre application.

Affichage de la progression

Si vous vous en souvenez, vous créiez un indicateur de progression pour montrer à vos utilisateurs quand les saveurs se chargent dans l’application.

Pour terminer cette fonctionnalité, revenez à PickFlavorViewController.ensuite, ajoutez les méthodes d’assistance suivantes après loadFlavors():

private func showLoadingHUD() { let hud = MBProgressHUD.showAdded(to: contentView, animated: true) hud.label.text = "Loading..."}private func hideLoadingHUD() { MBProgressHUD.hide(for: contentView, animated: true)}

Maintenant, dans loadFlavors():

private func showLoadingHUD() { let hud = MBProgressHUD.showAdded(to: contentView, animated: true) hud.label.text = "Loading..."}private func hideLoadingHUD() { MBProgressHUD.hide(for: contentView, animated: true)}

Maintenant, dans loadFlavors(), ajouter les deux lignes suivantes (comme indiqué):

 private func loadFlavors() { showLoadingHUD() // <-- Add this line Alamofire.request( "https://www.raywenderlich.com/downloads/Flavors.plist", method: .get, encoding: PropertyListEncoding(format: .xml, options: 0)) .responsePropertyList { response in guard let self = self else { return } self.hideLoadingHUD() // <-- Add this line // ...

Comme les noms de méthode l’impliquent, showLoadingHUD() affiche une instance de MBProgressHUD pendant que la requête GET se télécharge. hideLoadingHUD() masque le HUD lorsque la requête se termine. Comme showLoadingHUD() est en dehors de la fermeture, il n’a pas besoin du préfixe self.

Construire et exécuter. Vous verrez maintenant un indicateur de chargement pendant le chargement des saveurs. Si votre connexion Internet est trop rapide pour cela, vous pouvez ajouter une instruction sleep(_:) juste avant hideLoadingHUD() afin que vous puissiez découvrir la bonté qu’est MBProgressHUD. :]

Application avec symbole de chargement

Excellent travail! Les clients peuvent maintenant sélectionner leur saveur de crème glacée préférée et ils voient un indicateur de chargement pendant le téléchargement des saveurs.

Où aller À Partir d’Ici?

Vous pouvez télécharger le projet terminé en utilisant le bouton Télécharger les matériaux en haut ou en bas de cette page.

Félicitations! Vous connaissez maintenant les bases de l’utilisation des CocoaPods, y compris la création et la modification de dépendances et la compréhension du versionnage sémantique. Vous êtes maintenant prêt à commencer à les utiliser dans vos propres projets!

Il y a beaucoup plus que vous pouvez faire avec les CocoaPods. Vous pouvez rechercher des pods existants sur le site officiel des CocoaPods. Reportez-vous également aux guides CocoaPods pour apprendre les détails les plus fins de cet excellent outil. Mais attention, une fois que vous commencerez à l’utiliser, vous vous demanderez comment vous avez réussi à vous en passer! :]

J’espère que vous avez aimé lire ce tutoriel CocoaPods autant que je l’ai écrit. Quels sont vos cocoapodes préférés? Sur lesquels comptez-vous le plus pour vos projets quotidiens? N’hésitez pas à partager, ou à poser des questions, dans les commentaires ci-dessous!

raywenderlich.com Hebdomadaire

Le raywenderlich.com la newsletter est le moyen le plus simple de rester à jour sur tout ce que vous devez savoir en tant que développeur mobile.

Obtenez un résumé hebdomadaire de nos tutoriels et cours, et recevez un cours par e-mail gratuit en bonus!

Note moyenne

4.8/5

Ajouter une note pour ce contenu

Connectez-vous pour ajouter une note

33 notes

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.