Ciao a tutti, oggi parliamo di un semplice e vitale strumento che ci aiuterà nella gestione dei nostri progetti e che ogni sviluppatore di applicazioni iPhone e iPad sicuramente apprezzerà.
Di cosa stiamo parlando? Di CocoaPods. Tecnicamente è uno script ruby in grado di gestire in modo automatizzato le dipendenze nei progetti Xcode, ma detto in maniera più semplice è la soluzione ai problemi con i quali tutti, chi prima chi poi, ci siamo imbattuti quando ad esempio abbiamo dovuto installare una nuova libreria trovata su github. Un secondo vantaggio meno evidente, ma non meno importante, è relativo agli aggiornamenti delle librerie stesse. Già, perché il problema grave è che spesso per configurare delle librerie esterne viene semplicemente copiato il sorgente completo all’interno del proprio progetto, rendendo in questo modo difficile – se non impossibile – gestirne gli update in maniera regolare. Ma niente paura, da oggi userete tutti CocoaPods e i vostri problemi svaniranno.
Sul sito di riferimento (http://cocoapods.org/) si puo’ trovare una brevissima guida per l’installazione. Noi la vedremo comunque nel dettaglio in un esempio concreto: creeremo un progetto Xcode che fa uso di due librerie esterne: AFNetworking e MagicalRecord.
Fase 1: Installare CocoaPods
L’installazione è molto semplice perché sfrutta il metodo di distribuzione tipico di Ruby, le gemme. Aprite quindi il terminale (non chiedete cosa sia il terminale! 🙂 ) e digitate
[sudo] gem install cocoapods
Le parentesi indicano che la parola “sudo” è facoltativa, ma tranne rari casi in cui siete già loggati come utente root, è necessario digitarla. Vi verrà richiesta la password dell’account amministrativo, digitatela e attendete qualche minuto. L’installazione non è rapida e potrebbe sembrare che tutto sia bloccato… ma dategli almeno 5/10 minuti di tempo.
Una volta installata la gemma bisognerà lanciare il comando
pod setup
Fase 2: Dichiarare le proprie dipendenze
Una volta installato cocoapods creiamo il nostro progetto di esempio, che configureremo con AFNetworking e MagicalRecord. Potete creare un progetto di tipo “Single View” perché non faremo nulla di grafico, ci limiteremo a configurare correttamente le due librerie. Create quindi il vostro progetto e assegnategli il nome che preferite, poi aprite il terminale e posizionatevi nella stessa cartella nella quale avete creato il progetto.
Il prossimo passo è quello di generare il file dove andremo ad elencare quali sono le dipendenze del nostro progetto e alcuni altri dettagli. Create quindi un nuovo file di testo usando un qualsiasi editor testuale (textmax, sublimetext, textwrangler, smultron…) all’interno della cartella del progetto e chiamatelo Podfile. Questa è la struttura del mio attuale progetto:

Ma cosa dovremo scrivere dentro questo file? Intanto specifichiamo la piattaforma e la release per la quale stiamo sviluppiamo in modo che lo script sappia cosa cercare:
platform :ios, 6.1
Quindi andiamo a specificare, una per una, le nostre dipendenze. Aggiungiamo questa riga al file:
pod AFNetworking
per specificare che vogliamo utilizzare AFNetworking (a MagicalRecord ci penseremo tra un attimo).
Salvate il file “Podfile” e aprite un terminale posizionandovi nella cartella del progetto.
Consiglio a tutti l’installazione di un piccolo programmino gratuito dal divertente nome di “Go2Shell” (gioco di parole con Go to hell->Vai all’inferno Nda) https://itunes.apple.com/it/app/go2shell/id445770608?l=en&mt=12 che vi permette di aprire un teminale già posizionato nella directory corrente.
Fase 3: Installare le dipendenze
Digitate:
pod install
finito 🙂
Scherzi a parte cocoapods fa un lungo lavoro in cui preleva la libreria richiesta da github, la inserire in un progetto AdHoc e configura un nuovo workspace per gestire il tutto, infatti sul teminale possiamo vedere:
Downloading dependencies Installing AFNetworking (1.3.1) Generating Pods project Integrating client project [!] From now on use `DevAppCocoaPods.xcworkspace`.
Quell’ultimo messaggio significa che da adesso in poi dovremo usare il file del workspace e non il singolo progetto.
La struttura delle cartelle è diventata questa:

dove possiamo vedere l’icona del workspace che una volta aperto si presenta così:

CocoaPods si è già preoccupato di configurare correttamente le variabili di ambiente HEADER_SEARCH_PATH, di includere i framework di sistema necessari per AFNetoworking, realizzare per noi la libreria statica e tutta un’altra serie di cose che se gestite manualmente avrebbero portato via un mare di tempo.
Per assicurarci che tutto abbia funzionato correttamente inseriamo un pezzo di codice che utilizzi AFNetworking e vediamo se è tutto ok.
Aprite il progetto (il workspace, mi raccomando) e modificate il file AppDelegate.m importando una delle classi più utili di questo framework:
#import "AFJSONRequestOperation.h"
Quindi aggiungiamo un po’ di codice all’interno del metodo application:didFinishLaunchingWithOptions: nel relativo file di implementazione:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSURL *url = [NSURL URLWithString:@"https://alpha-api.app.net/stream/0/posts/stream/global"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
NSLog(@"App.net Global Stream: %@", JSON);
} failure:nil];
[operation start];
return YES;
}
Se avete fatto tutto correttamente sarete in grado di compilare l’applicazione e vedere il risultato nella console di log. Attenti a selezionare il giusto target dal menù in alto!

Ok, ma abbiamo installato solo AFNetworking e adesso? Niente di più facile, per installare tutte le altre dipendenze non c’è che da aggiungere la riga specifica al file Podfile, quindi aggiungiamo:
MagicalRecord
e dal terminale digitiamo nuovamente:
pod install
CocoaPods si renderà conto della nuova dipendenza ed installerà soltanto quella, lasciando il resto inalterato.
Per verificare che tutto funzioni modifichiamo al solito AppDelegate.m importando il file principale di MagicalRecord tramite:
#import "CoreData+MagicalRecord.h"
Proviamo quindi a creare l’intero stack di CoreData con questo metodo:
[MagicalRecord setupCoreDataStackWithAutoMigratingSqliteStoreNamed:@"database.sqlite"];
Se tutto compila senza errori ce l’avete fatta 🙂 il vostro progetto AFNetworking + MagicalRecord è pronto e senza nessun mal di testa.
Conclusioni
Prima di concludere ci sono due comandi che sicuramente vi faranno molto comodo e ne approfitto per segnalarveli.
Il primo è search nella sintassi:
pod search nomelibreria
Grazie a questo comando potrete cercare se è presente una libreria nell’archivio di CocoaPods. Il secondo comando è:
pod update
il cui compito, come avrete intuito, è quello di verificare l’esistenza di versioni più aggiornate delle librerie che stiamo utilizzando.
And now?
Adesso che avete appreso le basi di cocosapods potete guardare la documentazione del progetto disponibile qui: http://docs.cocoapods.org/ per verificare le diverse opzioni utilizzabili e poi generare le specifiche pods anche per i vostri progetti su github così che gli altri utenti possano installare le vostre librerie in modo semplice e veloce!
Utile, no?
Buona programmazione!
PS: Come è stato giustamente segnalato nei commenti, l’installazione di Cococapod (e di tanta altra bella roba) richiede l’installazione di “Xcode command line tools” liberamente scaricabili e installabili da qui: https://developer.apple.com/xcode/
![]() |
![]() |
![]() |













3 Responses to “CococaPods: gestire le dipendenze e gli aggiornamenti in Xcode in modo automatico”
22 Novembre 2013
mlenaPosso solo suggerire di controllare di avere “Command Line Tools” installato in XCode? Capra come sono ho cercato di installare cocoapods svariate volte senza successo (e senza capirne il motivo)… Magari può aiutare qualche altro “quasi principiante” come me!!
Per il resto ottima guida… chiara, utile e leggibile!!
23 Novembre 2013
IgnazioCgrazie mille dell’indicazione! 🙂 l’ho inserita in calce all’articolo.
9 Aprile 2014
dcrescentiall’esecuzione di
pod install
ottengo il seguente messaggio
—
Setting up CocoaPods master repo
[!] Pod::Executable clone ‘https://github.com/CocoaPods/Specs.git’ master –depth=1
Cloning into ‘master’…
fatal: Unable to find remote helper for ‘https’
/Library/Ruby/Gems/2.0.0/gems/claide-0.5.0/lib/claide/command.rb:281:in `rescue in run’: undefined method `verbose?’ for nil:NilClass (NoMethodError)
from /Library/Ruby/Gems/2.0.0/gems/claide-0.5.0/lib/claide/command.rb:274:in `run’
from /Library/Ruby/Gems/2.0.0/gems/cocoapods-0.31.1/lib/cocoapods/command.rb:51:in `run’
from /Library/Ruby/Gems/2.0.0/gems/cocoapods-0.31.1/bin/pod:33:in `’
from /usr/bin/pod:23:in `load’
from /usr/bin/pod:23:in `’
—
N.B. – anche pod setup mi ha dato un errore eccolo:
—
[!] Pod::Executable clone ‘https://github.com/CocoaPods/Specs.git’ master –depth=1
Cloning into ‘master’…
fatal: Unable to find remote helper for ‘https’
—
non so cosa fare, non sono ferrato sui comandi da terminale o sulle possibili problematiche. Ho cercato in rete ma non ho risolto nulla.
P.S. – sono collegato da una virtual machine che monta OS X Mavericks 10.9.2 e mi collego alla rete via NAT in modalità NAT.