{"id":10675,"date":"2013-07-30T13:41:58","date_gmt":"2013-07-30T11:41:58","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=10675"},"modified":"2013-11-23T10:57:17","modified_gmt":"2013-11-23T09:57:17","slug":"cococapods-gestire-le-dipendenze-e-gli-aggiornamenti-in-xcode-in-modo-automatico","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/cococapods-gestire-le-dipendenze-e-gli-aggiornamenti-in-xcode-in-modo-automatico\/","title":{"rendered":"CococaPods: gestire le dipendenze e gli aggiornamenti in Xcode in modo automatico"},"content":{"rendered":"<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/07\/CocoaPods-Xcode-01.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-10704\" alt=\"CocoaPods-Xcode-01\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/07\/CocoaPods-Xcode-01.jpg\" width=\"303\" height=\"352\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/07\/CocoaPods-Xcode-01.jpg 303w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/07\/CocoaPods-Xcode-01-258x300.jpg 258w\" sizes=\"auto, (max-width: 303px) 100vw, 303px\" \/><\/a> Ciao a tutti, oggi parliamo di un semplice e vitale strumento che ci aiuter\u00e0 nella gestione dei nostri progetti e che ogni sviluppatore di applicazioni iPhone e iPad sicuramente apprezzer\u00e0.<br \/>\nDi cosa stiamo parlando? Di <strong>CocoaPods<\/strong>. Tecnicamente \u00e8 uno script ruby in grado di <strong>gestire in modo automatizzato le dipendenze nei progetti Xcode<\/strong>, ma detto in maniera pi\u00f9 semplice \u00e8 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, \u00e8 relativo agli aggiornamenti delle librerie stesse. Gi\u00e0, perch\u00e9 il problema grave \u00e8 che spesso per configurare delle librerie esterne viene semplicemente copiato il sorgente completo all&#8217;interno del proprio progetto, rendendo in questo modo difficile &#8211; se non impossibile &#8211; gestirne gli update in maniera regolare. Ma niente paura, da oggi userete tutti CocoaPods e i vostri problemi svaniranno.<\/p>\n<p>Sul sito di riferimento (<a href=\"http:\/\/cocoapods.org\/\" target=\"_blank\">http:\/\/cocoapods.org\/<\/a>) si puo&#8217; trovare una brevissima guida per l&#8217;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.<!--more--><\/p>\n<h1>Fase 1: Installare CocoaPods<\/h1>\n<p>L&#8217;installazione \u00e8 molto semplice perch\u00e9 sfrutta il metodo di distribuzione tipico di Ruby, le gemme. Aprite quindi il terminale (non chiedete cosa sia il terminale! \ud83d\ude42 ) e digitate<\/p>\n<pre>[sudo] gem install cocoapods<\/pre>\n<p>Le parentesi indicano che la parola &#8220;sudo&#8221; \u00e8 facoltativa, ma tranne rari casi in cui siete gi\u00e0 loggati come utente root, \u00e8 necessario digitarla. Vi verr\u00e0 richiesta la password dell&#8217;account amministrativo, digitatela e attendete qualche minuto. L&#8217;installazione non \u00e8 rapida e potrebbe sembrare che tutto sia bloccato&#8230; ma dategli almeno 5\/10 minuti di tempo.<\/p>\n<p>Una volta installata la gemma bisogner\u00e0 lanciare il comando<\/p>\n<pre>pod setup<\/pre>\n<h1>Fase 2: Dichiarare le proprie dipendenze<\/h1>\n<p>Una volta installato cocoapods creiamo il nostro progetto di esempio, che configureremo con <strong>AFNetworking<\/strong> e <strong>MagicalRecord<\/strong>. Potete creare un progetto di tipo &#8220;Single View&#8221; perch\u00e9 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.<\/p>\n<p>Il prossimo passo \u00e8 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&#8230;) all&#8217;interno della cartella del progetto e chiamatelo <code>Podfile<\/code>. Questa \u00e8 la struttura del mio attuale progetto:<\/p>\n<p>&nbsp;<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/07\/Screen-Shot-2013-07-28-at-6.48.30-PM.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-10681\" alt=\"Screen Shot 2013-07-28 at 6.48.30 PM\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/07\/Screen-Shot-2013-07-28-at-6.48.30-PM-300x129.png\" width=\"300\" height=\"129\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/07\/Screen-Shot-2013-07-28-at-6.48.30-PM-300x129.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/07\/Screen-Shot-2013-07-28-at-6.48.30-PM.png 585w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/center>&nbsp;<\/p>\n<p>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:<\/p>\n<pre>platform :ios, 6.1<\/pre>\n<p>Quindi andiamo a specificare, una per una, le nostre dipendenze. Aggiungiamo questa riga al file:<\/p>\n<pre>pod AFNetworking<\/pre>\n<p>per specificare che vogliamo utilizzare AFNetworking (a MagicalRecord ci penseremo tra un attimo).<\/p>\n<p>Salvate il file &#8220;Podfile&#8221; e aprite un terminale posizionandovi nella cartella del progetto.<\/p>\n<p><em>Consiglio a tutti l&#8217;installazione di un piccolo programmino gratuito dal divertente nome di &#8220;Go2Shell&#8221; (gioco di parole con Go to hell-&gt;Vai all&#8217;inferno Nda) <a href=\"https:\/\/itunes.apple.com\/it\/app\/go2shell\/id445770608?l=en&amp;mt=12\" target=\"_blank\">https:\/\/itunes.apple.com\/it\/app\/go2shell\/id445770608?l=en&amp;mt=12<\/a> che vi permette di aprire un teminale gi\u00e0 posizionato nella directory corrente.<\/em><\/p>\n<h1>Fase 3: Installare le dipendenze<\/h1>\n<p>Digitate:<\/p>\n<pre>pod install<\/pre>\n<p>finito \ud83d\ude42<\/p>\n<p>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:<\/p>\n<pre>Downloading dependencies\r\nInstalling AFNetworking (1.3.1)\r\nGenerating Pods project\r\nIntegrating client project\r\n\r\n[!] From now on use `DevAppCocoaPods.xcworkspace`.<\/pre>\n<p>Quell&#8217;ultimo messaggio significa che da adesso in poi dovremo usare il file del workspace e non il singolo progetto.<\/p>\n<p>La struttura delle cartelle \u00e8 diventata questa:<\/p>\n<p>&nbsp;<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/07\/Screen-Shot-2013-07-28-at-7.04.00-PM.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-10685\" alt=\"Screen Shot 2013-07-28 at 7.04.00 PM\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/07\/Screen-Shot-2013-07-28-at-7.04.00-PM-300x103.png\" width=\"300\" height=\"103\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/07\/Screen-Shot-2013-07-28-at-7.04.00-PM-300x103.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/07\/Screen-Shot-2013-07-28-at-7.04.00-PM.png 593w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/center>&nbsp;<\/p>\n<p>dove possiamo vedere l&#8217;icona del workspace che una volta aperto si presenta cos\u00ec:<\/p>\n<p>&nbsp;<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/07\/Screen-Shot-2013-07-28-at-7.05.41-PM.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-10687\" alt=\"Screen Shot 2013-07-28 at 7.05.41 PM\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/07\/Screen-Shot-2013-07-28-at-7.05.41-PM-219x300.png\" width=\"219\" height=\"300\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/07\/Screen-Shot-2013-07-28-at-7.05.41-PM-219x300.png 219w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/07\/Screen-Shot-2013-07-28-at-7.05.41-PM.png 269w\" sizes=\"auto, (max-width: 219px) 100vw, 219px\" \/><\/a><\/center>&nbsp;<\/p>\n<p>CocoaPods si \u00e8 gi\u00e0 preoccupato di configurare correttamente le variabili di ambiente <strong>HEADER_SEARCH_PATH<\/strong>, di includere i framework di sistema necessari per AFNetoworking, realizzare per noi la libreria statica e tutta un&#8217;altra serie di cose che se gestite manualmente avrebbero portato via un mare di tempo.<\/p>\n<p>Per assicurarci che tutto abbia funzionato correttamente inseriamo un pezzo di codice che utilizzi AFNetworking e vediamo se \u00e8 tutto ok.<\/p>\n<p>Aprite il progetto (il workspace, mi raccomando) e modificate il file AppDelegate.m importando una delle classi pi\u00f9 utili di questo framework:<\/p>\n<pre>#import \"AFJSONRequestOperation.h\"<\/pre>\n<p>Quindi aggiungiamo un po&#8217; di codice all&#8217;interno del metodo application:didFinishLaunchingWithOptions: nel relativo file di implementazione:<\/p>\n<pre>- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions\r\n{\r\n    NSURL *url = [NSURL URLWithString:@\"https:\/\/alpha-api.app.net\/stream\/0\/posts\/stream\/global\"];\r\n    NSURLRequest *request = [NSURLRequest requestWithURL:url];\r\n    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {\r\n        NSLog(@\"App.net Global Stream: %@\", JSON);\r\n    } failure:nil];\r\n    [operation start];\r\n\r\n    return YES;\r\n}<\/pre>\n<p>Se avete fatto tutto correttamente sarete in grado di compilare l&#8217;applicazione e vedere il risultato nella console di log. Attenti a selezionare il giusto target dal men\u00f9 in alto!<\/p>\n<p>&nbsp;<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/07\/Screen-Shot-2013-07-28-at-7.19.24-PM.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-10689\" alt=\"Screen Shot 2013-07-28 at 7.19.24 PM\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/07\/Screen-Shot-2013-07-28-at-7.19.24-PM-300x75.png\" width=\"300\" height=\"75\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/07\/Screen-Shot-2013-07-28-at-7.19.24-PM-300x75.png 300w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/07\/Screen-Shot-2013-07-28-at-7.19.24-PM.png 454w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/center>&nbsp;<\/p>\n<p>Ok, ma abbiamo installato solo AFNetworking e adesso? Niente di pi\u00f9 facile, per installare tutte le altre dipendenze non c&#8217;\u00e8 che da aggiungere la riga specifica al file Podfile, quindi aggiungiamo:<\/p>\n<pre>MagicalRecord<\/pre>\n<p>e dal terminale digitiamo nuovamente:<\/p>\n<pre>pod install<\/pre>\n<p>CocoaPods si render\u00e0 conto della nuova dipendenza ed installer\u00e0 soltanto quella, lasciando il resto inalterato.<\/p>\n<p>Per verificare che tutto funzioni modifichiamo al solito AppDelegate.m importando il file principale di MagicalRecord tramite:<\/p>\n<pre>#import \"CoreData+MagicalRecord.h\"<\/pre>\n<p>Proviamo quindi a creare l&#8217;intero stack di CoreData con questo metodo:<\/p>\n<pre>[MagicalRecord setupCoreDataStackWithAutoMigratingSqliteStoreNamed:@\"database.sqlite\"];<\/pre>\n<p>Se tutto compila senza errori ce l&#8217;avete fatta \ud83d\ude42 il vostro progetto AFNetworking + MagicalRecord \u00e8 pronto e senza nessun mal di testa.<\/p>\n<h1>Conclusioni<\/h1>\n<p>Prima di concludere ci sono due comandi che sicuramente vi faranno molto comodo e ne approfitto per segnalarveli.<\/p>\n<p>Il primo \u00e8 search nella sintassi:<\/p>\n<pre>pod search nomelibreria<\/pre>\n<p>Grazie a questo comando potrete cercare se \u00e8 presente una libreria nell&#8217;archivio di CocoaPods. Il secondo comando \u00e8:<\/p>\n<pre>pod update<\/pre>\n<p>il cui compito, come avrete intuito, \u00e8 quello di verificare l&#8217;esistenza di versioni pi\u00f9 aggiornate delle librerie che stiamo utilizzando.<\/p>\n<h1>And now?<\/h1>\n<p>Adesso che avete appreso le basi di cocosapods potete guardare la documentazione del progetto disponibile qui: <a href=\"http:\/\/docs.cocoapods.org\/\" target=\"_blank\">http:\/\/docs.cocoapods.org\/<\/a> per verificare le diverse opzioni utilizzabili e poi generare le specifiche pods anche per i vostri progetti su github cos\u00ec che gli altri utenti possano installare le vostre librerie in modo semplice e veloce!<\/p>\n<p>Utile, no?<br \/>\nBuona programmazione!<\/p>\n<p>&nbsp;<\/p>\n<p>PS: Come \u00e8 stato giustamente segnalato nei commenti, l&#8217;installazione di Cococapod (e di tanta altra bella roba) richiede l&#8217;installazione di &#8220;Xcode command line tools&#8221; liberamente scaricabili e installabili da qui:\u00a0https:\/\/developer.apple.com\/xcode\/<\/p>\n<table>\n<tbody>\n<tr>\n<td><a href=\"http:\/\/www.devapp.it\/wordpress\/author\/ignazioc\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-10708\" alt=\"Articoli-Ignazio-Calo-devAPP\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/07\/Articoli-Ignazio-Calo-devAPP.jpg\" width=\"213\" height=\"75\" \/><\/a><\/td>\n<td><a href=\"http:\/\/www.devapp.it\/wordpress\/corso-completo-di-programmazione-in-c\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-10710\" alt=\"corso-programmazione-c-devapp-ignazio-calo\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/07\/corso-programmazione-c-devapp-ignazio-calo.jpg\" width=\"213\" height=\"75\" \/><\/a><\/td>\n<td><a href=\"http:\/\/www.devapp.it\/wordpress\/corso-di-programmazione-videogame-per-iphone-e-ipad-con-cocos2d\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-10711\" alt=\"corso-cocos2d-devapp-ignazio-calo\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/07\/corso-cocos2d-devapp-ignazio-calo.jpg\" width=\"216\" height=\"75\" \/><\/a><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n","protected":false},"excerpt":{"rendered":"<p>Ciao a tutti, oggi parliamo di un semplice e vitale strumento che ci aiuter\u00e0 nella gestione dei&#8230;<\/p>\n","protected":false},"author":53,"featured_media":10703,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[481],"tags":[1309,1313,1311,1312,1310],"class_list":["post-10675","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-risorse-utili","tag-afnetworking","tag-gestire-le-dipendenze-xcode","tag-installare-e-usare-cocoapods","tag-librerie-esterne-ios","tag-magicalrecord"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/10675","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/53"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=10675"}],"version-history":[{"count":38,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/10675\/revisions"}],"predecessor-version":[{"id":10861,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/10675\/revisions\/10861"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media\/10703"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=10675"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=10675"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=10675"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}