[iOS] intégration d’une librairie avec CocoaPods

mercredi 13 août 2014

Dans ce tutoriel, je vais vous présenter comment installer et utiliser CocoaPods:

Mais avant tout c’est quoi CocoaPods:
C’est un outil de gestion des dépendances pour Objective-C qui permet de

  • – centraliser toutes les librairies disponibles
  • – faciliter la recherche de mise à jour de ces librairies
  • – faciliter l’inclusion des librairies dans votre projet

Installation de CocoaPods:

sudo gem update --system
sudo gem install cocoapods
pod setup

Attention, quand j’ai mis à jour mon Mac sur El Capitan, je suis tombé sur l’erreur suivante: ERROR: While executing gem … (Errno::EPERM) => « Operation not permitted ».
Pour la résoudre, voici les commandes à exécuter dans l’ordre:

mkdir -p $HOME/Software/ruby
export GEM_HOME=$HOME/Software/ruby
gem install cocoapods
export PATH=$PATH:$HOME/Software/ruby/bin
pod --version
</p>
Voici
<p>Maintenant que cocoaPods est installé sur votre machine, nous allons voir comment installé la librairie AFNetworking avec cet outil dans notre projet.</p>
<p>Tout d'abord, dirigeons nous dans notre projet:</p>
 cd /path/to/Folder/Project

Une fois dans votre projet exécuté la commande suivante pour créé le fichier Podfile dans votre projet.

pod init
// Ouvre le fichier dans Xcode
open -a Xcode Podfile

Remplacer la ligne # platform :ios, "6.0" par platform :ios, "7.0"

Dans ce cas CocoaPods ne récupèrera que les pods qui sont compatible pour iOS7 et supérieur!

Maintenant on peut inclure les dépendances nécessaires à notre projet.
Pour cela il suffit de rajouter la ligne suivante après le "target 'xxxx' do"

pod 'AFNetworking', '2.3.1'

Il est possible de mettre des directives avec le tag post_install dans le fichier PodFile.
C'est un script Ruby qui est exécuter après l'installation des pods et à pour but de modifier les settings Pods pour contourner certaines conditions comme par exemple dans le script ci dessous.
Qui force les architectures à armv7 et armv7s et retire l'architecture armv64.
Dans ce cas-ci c'est qu'il y a une librairie qui ne supporte toujours pas le 64 bits!
Mais bon c'est un setting qu'on doit plus voir maintenant car toutes les libraries doivent toutes passées sous 64 bits.

post_install do |installer_representation|
  installer_representation.project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['ARCHS'] = 'armv7 armv7s'
    end
  end
end

Donc avec cocoapods, il créé un projet pods qio contient ces propres build settings gérer par cocoapods lui-même en fonction des librairies importées.
Donc à éviter de modifier ou alors avec des directives dans le fichier PodFile.
Et donc mieux vaut laisser cocoapods gérer ces settings lui-même et les librairies qu'on inclut dans notre projet ou les settings qu'on veut changer pour son projet on le fait dansle target de son projet et non celui de pods.

Les Build Settings injectés par CocoaPods le sont via des fichiers ".xcconfig".
Ces settings définissent les valeurs par défaut, mais il est possible de les surcharger dans l'interface de Xcode en allant dans l'onglet Build Settings du projet ou du target.
Pour chaque Build Settings, s'il y a une valeur indiquée pour ce setting au niveau du target, c'est celui-là qui prime. Sinon c'est celui au niveau du projet s'il existe, sinon c'est celui au niveau du xcconfig, et seulement si aucun des 3 niveaux ne définit de valeur c'est la valeur par défaut.
Mais pour chaque niveau de Build Settings, il est possible d'overrider complètement, en utilisant "$(inherited)" pour hériter des Build Settings du niveau parent et y rajouter d'autres options. L'idéal est d'utiliser $(inherited) pour rajouter des réglages pour conserver les réglages CocoaPods qui lui donne les bons réglages des librairies. Il est évidemment pas conseillé de modifier directement les settings du projet Pods car ils sont défini pour les librairies importés.

Après avoir sauver le fichier, il faut demander à cocoaPods d'installer les dépendances de votre projet en Terminal.
Assurez-vous de bien toujours être dans le dossier de votre projet.

pod install

Résultat:

Analyzing dependencies
Downloading dependencies
Installing AFNetworking (2.3.1)
Generating Pods project
Integrating client project
[!] From now on use `Borne.xcworkspace`.

Attention: maintenant il est important de toujours utiliser le fichier xcworkspace pour votre projet et non le fichier .xcodeproj

Le tour est joué la librairie est incluse dans votre workspace et vous trouverez un autre target Pods dans lequel on retrouve toute la librairie AFNetworking.
On a rien dû importer dans le projet, pas de framework et pas besoin de configurer des build phases

Attention: si vous utilisez cocoapods et que vous devez rajouter des "other links flags", il faudra les encoder dans le fichier "Pods-project_name.xcconfig"du projet cocoapods et non plus dans le Build settings de votre projet.

Commande pod utiles:

// Pour faire une recherche
pod search 'AfNetworking'
//Mettre à jour les librairies
pod update

Tags: CocoaPods , library , Pods