{"id":10841,"date":"2013-11-12T18:12:59","date_gmt":"2013-11-12T17:12:59","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=10841"},"modified":"2013-11-12T18:14:48","modified_gmt":"2013-11-12T17:14:48","slug":"xcode-tips-tricks-gestione-del-filesystem-un-progetto-piu-versioni-plugin","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/xcode-tips-tricks-gestione-del-filesystem-un-progetto-piu-versioni-plugin\/","title":{"rendered":"Xcode Tips &#038; Tricks: Gestione del filesystem, un progetto pi\u00f9 versioni, plugin"},"content":{"rendered":"<p>Qualche settimana fa ho avuto modo di partecipare al meeting di <a href=\"http:\/\/pragmamark.org\/\" target=\"_blank\">#pragma mark<\/a> ed ascoltare l&#8217;interessante presentazione di Massimo Oliviero intitolata &#8220;<a href=\"http:\/\/www.slideshare.net\/MassimoOliviero\" target=\"_blank\">Building iOS App Project &#038; Architecture<\/a>&#8221; e mi \u00e8 venuta l&#8217;idea di scrivere questo articolo.<\/p>\n<p>Tutti noi usiamo quotidianamente Xcode, ma un po&#8217; per prigrizia e un po&#8217; per oggettiva complessit\u00e0 del programma, molto spesso ci limitamo ad usare le funzionalit\u00e0 principali, trascurando invece funzionalit\u00e0 che in alcuni casi posso renderci la vita pi\u00f9 semplice.<!--more--><\/p>\n<h1>Gestione del filesystem<\/h1>\n<p>Diciamoci la verit\u00e0, se c&#8217;\u00e8 un punto dolente su Xcode \u00e8 proprio la sua gestione del filesystem. Per quanto il progetto possa apparire ordinato, con tanto di gruppi e sottogruppi in realt\u00e0 \u00e8 solo un&#8217;illusione \ud83d\ude09 perch\u00e9 per impostazione predefinita Xcode piazza tutti i file nella stessa directory, e la nostra reazione quando lo scopriamo \u00e8 pi\u00f9 o meno questa:<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-angry-desk-flip.jpg\" alt=\"Xcode-tips-tricks-angry-desk-flip\" width=\"624\" height=\"564\" class=\"aligncenter size-full wp-image-10843\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-angry-desk-flip.jpg 624w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-angry-desk-flip-300x271.jpg 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><br \/>\n<\/center><\/p>\n<p>Durante il talk di Massimo ho scoperto di non essere l&#8217;unico ossessivo-compulsivo sulla struttura delle cartelle e putroppo Xcode non ci rende la vita facile. Se volete ottenere una struttura ordinata sul filesystem il primo consiglio \u00e8 quello di partire fin da subito con il piede giusto, perch\u00e9 una volta che i file sono aggiunti al progetto pu\u00f2 non essere semplicissimo spostarli. Per esempio, personalmente prima di aggiungere una nuova classe al progetto creo sempre prima la cartella per ospitarla ed il modo pi\u00f9 veloce di farlo \u00e8 cliccare con il tasto destro su una cartella gi\u00e0 presente sul nostro progetto e selezionare &#8220;Add files to\u2026&#8221;<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-add_files.png\" alt=\"Xcode-tips-tricks-add_files\" width=\"355\" height=\"325\" class=\"aligncenter size-full wp-image-10844\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-add_files.png 355w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-add_files-300x274.png 300w\" sizes=\"auto, (max-width: 355px) 100vw, 355px\" \/><br \/>\n<\/center><\/p>\n<p>Nella finestra di selezione del file cliccare sul tasto &#8220;New folder&#8221;<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-new_folder.png\" alt=\"Xcode-tips-tricks-new_folder\" width=\"278\" height=\"194\" class=\"aligncenter size-full wp-image-10845\" \/><br \/>\n<\/center><\/p>\n<p>e infine selezionare &#8220;Add&#8221;. In questo modo avremo creato una cartella sul filesystem e un gruppo all&#8217;interno del progetto e questi saranno linkati, cosicch\u00e9 tutti i file che creeremo dentro questo gruppo saranno creati dentro questa cartella.<\/p>\n<p>Per quanto riguarda le immagini trovo invece molto comoda la funzionalit\u00e0 di &#8220;folder reference&#8221; anche se devo dire che non \u00e8 molto usata. Quando trascinate su Xcode la vostra catella con le immagini, invece di selezionare &#8220;Create group for any added folder&#8221; selezionate &#8220;Create folder references for any added folder&#8221;, cos\u00ec come si vede nell&#8217;immagine qui di seguito:<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-folder_reference.png\" alt=\"Xcode-tips-tricks-folder_reference\" width=\"400\" height=\"272\" class=\"aligncenter size-full wp-image-10846\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-folder_reference.png 400w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-folder_reference-300x204.png 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><br \/>\n<\/center><\/p>\n<p>In questo modo Xcode creer\u00e0 un particolare gruppo, riconoscibile dal colore azzurro, che \u00e8 in realt\u00e0 un riferimento alla cartella sul filesystem. A differenza del gruppo creato precedentemente, in questo caso ci baster\u00e0 aggiungere un file all&#8217;interno della cartella e questo verr\u00e0 automaticamente reso disponibile all&#8217;interno di Xcode.<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-folder_reference_detail.png\" alt=\"Xcode-tips-tricks-folder_reference_detail\" width=\"247\" height=\"120\" class=\"aligncenter size-full wp-image-10847\" \/><br \/>\n<\/center><\/p>\n<p>I Folder reference sono mantenuti anche all&#8217;interno del progretto compilato, a differeza dei gruppi tradizionali che vengono poi &#8220;appiatti&#8221; durante la compilazione. Questo comporta per\u00f2 una notevolte differenza nella gestione dei file perch\u00e9 bisogner\u00e0 tenere conto della presenza di questa folder, ad esempio per caricare l&#8217;immagine bisogner\u00e0 scrivere<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nUIImage *img = [UIImage imageNamed:@\"images\/test.png\"];\r\n<\/pre>\n<p>Esiste anche una terza (e ancora meno usata) tecnica che consiste nell&#8217;usare i Bundle. Un bundle non \u00e8 altro che una cartella rinominata opportunamente con estensione *.bundle<\/p>\n<p>La comodit\u00e0 di utilizzo di un bundle \u00e8 che possono essere trattati come dei normali file e quindi se vi capita di dover distribuire delle risorse \u00e8 pi\u00f9 comodo distribuire un unico file .bundle invece che una folder con i file, infatti \u00e8 comune trovarli insieme ai framework.<\/p>\n<p>Per accedere programmaticamente al contenuto di un bundle bisogna prima ottenere un riferimento al bundle e successivamente si pu\u00f2 ricavare il percorso del file<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n    NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@\"images\" ofType:@\"bundle\"];\r\n    NSBundle *bundle = [NSBundle bundleWithPath:bundlePath];\r\n    NSString *filePath = [bundle pathForResource:@\"test\" ofType:@\"png\"];\r\n<\/pre>\n<h1>Un progetto, pi\u00f9 versioni<\/h1>\n<p>Questo argomento \u00e8 stato trattato spesso anche sul nostro forum, la domanda in genere \u00e8:<\/p>\n<blockquote><p>Devo realizzare due progetti identici, uno lite e uno pro. Devo fare una copia di tutto?<\/p><\/blockquote>\n<p>Neanche a dirlo, la risposta \u00e8 ovviamente no! La duplicazione del codice \u00e8 da evitare a tutti i livelli, mai avere due metodi che hanno lo stesso scopo, o due classi\u2026 o perfino due progetti.<\/p>\n<p>Esistono due metodi per risolvere in modo elegante questo problema: il primo \u00e8 creare pi\u00f9 target, il secondo pi\u00f9 configurazioni. Vediamo in dettaglio.<\/p>\n<p>Ciascun progetto xcode pu\u00f2 avere pi\u00f9 target, in Xcode 5 ne vengono creati di default due, il primo \u00e8 il target legato alla nostra applicazione iOS, mentre il secondo \u00e8 legato ai test (vedi <a href=\"http:\/\/www.devapp.it\/wordpress\/uno-sguardo-a-unit-test-impariamo-a-prevenire-ore-e-ore-di-debug-durante-lo-sviluppo-di-applicazioni-ios.html\" target=\"_blank\">qui<\/a>)<\/p>\n<p>Per creare un nuovo target possiamo duplicare uno dei target esistenti<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-clone_target.png\" alt=\"Xcode-tips-tricks-clone_target\" width=\"349\" height=\"176\" class=\"aligncenter size-full wp-image-10848\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-clone_target.png 349w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-clone_target-300x151.png 300w\" sizes=\"auto, (max-width: 349px) 100vw, 349px\" \/><br \/>\n<\/center><\/p>\n<p>oppure crearne uno ex-novo cliccando sull&#8217;opzione &#8220;Add Target\u2026&#8221; e selezionando il tipo di target desiderato.<\/p>\n<p>Utilizzare pi\u00f9 target offre il maggior livello di versatilit\u00e0, ma anche di complessit\u00e0, infatti sarebbe tecnicamente possibile creare anche applicazioni totalmente differenti a partire dalla stesso progetto, ma con differenti target. L&#8217;utilizzo pi\u00f9 tipico \u00e8 per\u00f2 quello in cui bisogna generare due applicazioni diverse che condividono la gran parte del codice, come ad esempio la versione iPad e la versione iPhone della stessa applicazione. Creando un nuovo target avremo un nuovo file info.plist dove specificare le caratteristiche del progetto, avremo i nuovi scheme per la compilazione e soprattutto avremo modo di specificare ciascun file a quali target appartiene<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-target_dest.png\" alt=\"Xcode-tips-tricks-target_dest\" width=\"276\" height=\"137\" class=\"aligncenter size-full wp-image-10849\" \/><br \/>\n<\/center><\/p>\n<p>La creazione di pi\u00f9 configurazioni \u00e8 differente rispetto alla creazione di pi\u00f9 target ed \u00e8 indicata quando si vuole compilare il progetto con alcune piccole varianti, come ad esempio la versione &#8220;pro&#8221; e la versione &#8220;lite&#8221; dello stesso progetto, oppure una versione con delle modifiche grafiche.<\/p>\n<p>Per creare una nuova configurazione selezionare il progetto, quindi, dalla tab &#8220;info&#8221;, cliccare sul pulsante &#8220;+&#8221; per duplicare una delle configurazioni attuali.<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-duplicate_conf.png\" alt=\"Xcode-tips-tricks-duplicate_conf\" width=\"389\" height=\"217\" class=\"aligncenter size-full wp-image-10850\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-duplicate_conf.png 389w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-duplicate_conf-300x167.png 300w\" sizes=\"auto, (max-width: 389px) 100vw, 389px\" \/><br \/>\n<\/center><\/p>\n<p>Una volta create le configurazioni necessarie potremo andare a specificare le opzioni di compilazione per la specifica configurazione, cos\u00ec come siamo gi\u00e0 abituati a fare per &#8220;debug&#8221; e &#8220;release&#8221;<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-name_options.png\" alt=\"Xcode-tips-tricks-name_options\" width=\"436\" height=\"146\" class=\"aligncenter size-full wp-image-10851\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-name_options.png 436w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-name_options-300x100.png 300w\" sizes=\"auto, (max-width: 436px) 100vw, 436px\" \/><br \/>\n<\/center><\/p>\n<p>La sezione di una configurazione al posto di un&#8217;altra avviene attraverso lo scheme. Cliccando su &#8220;Manage scheme&#8221; e successivamente doppio click sul nome dello scheme che vogliamo modificare, si accede alla schermata di gestione dello scheme.<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-manage_scheme.png\" alt=\"Xcode-tips-tricks-manage_scheme\" width=\"350\" height=\"178\" class=\"aligncenter size-full wp-image-10852\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-manage_scheme.png 350w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-manage_scheme-300x152.png 300w\" sizes=\"auto, (max-width: 350px) 100vw, 350px\" \/><br \/>\n<\/center><\/p>\n<p>per ciascuna delle sei tipologie di compilazione \u00e8 possibile definire quale configurazione utilizzare<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-edit_scheme.png\" alt=\"Xcode-tips-tricks-edit_scheme\" width=\"559\" height=\"382\" class=\"aligncenter size-full wp-image-10853\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-edit_scheme.png 559w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-edit_scheme-300x205.png 300w\" sizes=\"auto, (max-width: 559px) 100vw, 559px\" \/><br \/>\n<\/center><\/p>\n<p>L&#8217;opzione pi\u00f9 semplice \u00e8 quindi quella di creare un nuovo scheme e per il nuovo scheme selezionare le nuove configurazioni, cos\u00ec quando vorremo cambiare configurazione sar\u00e0 sufficiente buildare lo scheme corrispondente. Nel mio esempio ho creato dei file di configurazione per buildare una &#8220;red version&#8221; cio\u00e8 una versione che ha delle piccole varianti grafiche. Ho creato quindi uno scheme &#8220;SampleApp_redVersion&#8221; ed ho configurato lo scheme per usare i nuovi file di configurazione.<\/p>\n<p>Fin qui abbiamo creato le configurazioni, gli scheme, possiamo cambiare i settings ma non abbiamo visto nulla per identificare la versione in modo programmatico. Anche in questo caso gli approcci sono due, le variabili d&#8217;ambiente e le macro per il preprocessore.<\/p>\n<p>Per definire una variabile d&#8217;ambiente selezionare la tab &#8220;Arguments&#8221; dalla schermata di gestione degli scheme e aggiungere una variabile tramite il tasto &#8220;+&#8221;<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-env_variables.png\" alt=\"Xcode-tips-tricks-env_variables\" width=\"558\" height=\"380\" class=\"aligncenter size-full wp-image-10854\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-env_variables.png 558w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-env_variables-300x204.png 300w\" sizes=\"auto, (max-width: 558px) 100vw, 558px\" \/><br \/>\n<\/center><\/p>\n<p>Il valore di questa variabile sar\u00e0 accessibile via codice tramite la classe NSProcessiInfo<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n[[[NSProcessInfo processInfo] environment] objectForKey:@\"REDV\"];\r\n<\/pre>\n<p>L&#8217;utilizzo delle macro di preprocessore \u00e8 un po&#8217; diverso e permette di escludere dalla compilazione intere parti di codice e questo spesso pu\u00f2 rivelarsi molto utile.<\/p>\n<p>Per definire una nuova macro accedere ai settings del progetto e trovare la voce &#8220;Preprocessor macros&#8221;. Aprire il selettore e definire la nuova macro per le configurazioni desiderate, la macro \u00e8 nella forma <code>nomemacro=valore<\/code><\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-preprocessor.png\" alt=\"Xcode-tips-tricks-preprocessor\" width=\"494\" height=\"154\" class=\"aligncenter size-full wp-image-10855\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-preprocessor.png 494w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-preprocessor-300x93.png 300w\" sizes=\"auto, (max-width: 494px) 100vw, 494px\" \/><br \/>\n<\/center><\/p>\n<p>Per verificare via codice il valore di questa macro bisogner\u00e0 utilizzare i comandi del preprocessore, in particolare potremo scrivere:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\n#if REDV == 1\r\n    self.titleLbl.text = @\"Red Version\";\r\n    self.sampleView.backgroundColor = [UIColor redColor];\r\n#endif\r\n<\/pre>\n<p>La particolarit\u00e0 in questo caso \u00e8 che se REDV non \u00e8 dichiarata o non vale 1, le due righe di codice non vengono totalmente prese in considerazione perch\u00e9 rimosse in fase di preprocessing.<\/p>\n<h1>Gestire il numero di versione<\/h1>\n<p>Spesso si vuol automatizzare l&#8217;incremento del numero di build del progetto e in rete si trovano diversi script per farlo e tutti pi\u00f9 o meno si basano sul comando <strong>PlistBuddy<\/strong> che serve per intervenire direttamente sui file plist del nostro progetto. Pochi sanno che Apple fornisce un tool apposito per fare questo lavoro che si chiama <strong>agvtool<\/strong>. Per utilizzarlo dobbiamo soltanto configurare correttamente il progetto inserendo tra le opzioni il numero attuale di versione e la volont\u00e0 di utilizzare il tool di versioning di Apple. La configurazione corretta \u00e8 visibile in questa immagine<\/p>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-versioning.png\" alt=\"Xcode-tips-tricks-versioning\" width=\"587\" height=\"152\" class=\"aligncenter size-full wp-image-10856\" srcset=\"https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-versioning.png 587w, https:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-versioning-300x77.png 300w\" sizes=\"auto, (max-width: 587px) 100vw, 587px\" \/><br \/>\n<\/center><\/p>\n<p>Una volta che avremo configurato il progetto per incrementare il numero di build avviare un terminale e, posizionandosi nella directory del progetto, digitare:<\/p>\n<pre lang=\"objc\" line=\"1\" escaped=\"true\">\r\nagvtool bump -all\r\n<\/pre>\n<p>In questo modo verr\u00e0 incrementato il numero di build e verr\u00e0 memorizzato nel file plist del progetto.<\/p>\n<p>Ovviamente l&#8217;utilit\u00e0 di questo comando \u00e8 limitata soltanto a chi vuole automatizzare il processo di archiviazione e distribuzione, per esempio potrebbe essere una buona idea inserirlo in uno script hook di git o in uno script di generazione del file *.ipa per la distribuzione ad-hoc.<\/p>\n<h1>Un pluging to bring them all<\/h1>\n<p>Le funzionalit\u00e0 offerte da Xcode possono essere estese tramite tutta una serie di plugin sviluppati appositamente per semplificarci il lavoro. Purtroppo non esistono API ufficiali per lo sviluppo di questi plugin quindi il loro numero \u00e8 molto pi\u00f9 esiguo di quello che potrebbe essere in realt\u00e0. Tra i plugin che trovo pi\u00f9 utili vi segnalo:<\/p>\n<ul>\n<li><strong>ColorSense<\/strong> (<a href=\"https:\/\/github.com\/omz\/Colorsense-for-Xcode\" target=\"_blank\">https:\/\/github.com\/omz\/Colorsense-for-Xcode<\/a>) un plugin per rendere pi\u00f9 facile la digitazione di un colore all&#8217;interno del codice (<a href=\"http:\/\/www.youtube.com\/watch?v=eblRfDQM0Go\" target=\"_blank\">qui<\/a> un video)<\/li>\n<li><strong>Uncrustify<\/strong> (<a href=\"https:\/\/github.com\/benoitsan\/BBUncrustifyPlugin-Xcode\" target=\"_blank\">https:\/\/github.com\/benoitsan\/BBUncrustifyPlugin-Xcode<\/a>) per me che sono un fanatico dell&#8217;indentazione del codice \u00e8 stato una manna dal cielo, rende disponibile il comando uncrustify per formattare il codice direttamente da una voce di men\u00f9.<\/li>\n<li><strong>ImageNamed<\/strong> (<a href=\"https:\/\/github.com\/ksuther\/KSImageNamed-Xcode\" target=\"_blank\">https:\/\/github.com\/ksuther\/KSImageNamed-Xcode<\/a>) questo forse \u00e8 stato il primo plugin reso disponibile, facilita di molto il caricamento delle immagini con il metodo <code>imageWithName:<\/code> perch\u00e9 durante la digitazione visualizza un&#8217;anteprima dell&#8217;immagine.<\/li>\n<\/ul>\n<p><center><br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2013\/11\/Xcode-tips-tricks-screenshot.gif\" alt=\"Xcode-tips-tricks-screenshot\" width=\"516\" height=\"220\" class=\"aligncenter size-full wp-image-10857\" \/><br \/>\n<\/center><\/p>\n<p>Esiste poi un tool che si chiama <strong>Alcatraz<\/strong> (<a href=\"http:\/\/mneorr.github.io\/Alcatraz\/\" target=\"_blank\">http:\/\/mneorr.github.io\/Alcatraz\/<\/a>) che ha ispirato il titolo di questa sezione, ovvero un plugin che ci permette in modo semplice di installare\/disinstallare tutti gli altri plugin. L&#8217;installazione \u00e8 semplice in maniera vergognosa e con un semplice click si possono installare molti plugin utilissimi e tantissimi schemi di colore. Purtroppo l&#8217;unica pecca \u00e8 che attualmente il supporto con Xcode5 non \u00e8 totale. Sul mio mac ho sia Xcode 4.6.3 che 5.1 e installando Alcatraz riesco ad avviarlo soltanto da Xcode 4.6.3, tuttavia alcuni plugin installati funzionano successivamente anche con la versione 5.1<\/p>\n<p>Sicuramente l&#8217;integrazione avverr\u00e0 a brevissimo, quindi tenetevi pronti \ud83d\ude09<\/p>\n<p>Alla prossima e buona programmazione!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Qualche settimana fa ho avuto modo di partecipare al meeting di #pragma mark ed ascoltare l&#8217;interessante presentazione&#8230;<\/p>\n","protected":false},"author":53,"featured_media":10423,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[8],"tags":[1336,23,1303],"class_list":["post-10841","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-guide-varie","tag-tips-tricks-ios-developer","tag-xcode","tag-xcode-tips"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/10841","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=10841"}],"version-history":[{"count":2,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/10841\/revisions"}],"predecessor-version":[{"id":10859,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/10841\/revisions\/10859"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media\/10423"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=10841"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=10841"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=10841"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}