Come creare un Framework con Xcode 8. L’arte del riutilizzo e condivisione del codice

Giuseppe Sapienza

Compatibile con Xcode 8

Hai un problema con il tutorial? scrivi un commento in fondo alla pagina - non mordo!

UIKit, MapKit, VisibilitàKit, SoldiKit. Tutto il mondo delle applicazioni gira intorno ai frameworks (tranne l’ultimo citato).

Ma cos’è un framework?

Un framework è un’insieme di classi e strutture dati. Queste classi vengono conservate in uno speciale contenitore, per l’appunto il framework, che ne impedisce la lettura del contenuto (inteso come codice sorgente) e ne permette solo l’utilizzo (chiamate alle funzioni o agli init delle classi abilitate. Vedremo meglio tra poco).

Ok, ma a che servono i framework e perché dovrei crearne uno?

Immagina d’avere un problema con un’applicazione. La tua applicazione, per esempio, non sa cuocere due uova al tegamino. Dopo che ti sei sbattuto (il termine non è un caso) per diversi giorni per trovare una soluzione, alla fine te ne esci con una classe che ti permette di risolverlo:

Così ogni volta in cui ti ritroverai a sbattere due uova, grazie a quella classe, non dovrai far altro che invocare quel determinato metodo fregandotene di tutto quello che c’è all’interno (perché sai che funziona).

Dopo qualche settimana sviluppi una nuova applicazione e toh! eccolo là, il problema delle uova al tegamino ritorna puntualmente. Ma tu sei furbo e ti ricordi che avevi creato una classe nel precedente progetto. Allora torni là, copi la classe e la incolli nel nuovo progetto.

Creando un tuo framework personale metterai definitivamente fine al processo logorroico di copia ed incolla del codice tra i tuoi stessi progetti. Perché, inserendo la classe Cuoco dentro il framework, dovrai semplicemente importare ques’ultimo ogni qual volta avrai bisogno del suddetto framework in un progetto.

In più, qualora un tuo amico developer dovesse avere il tuo stesso problema o semplicemente sei un piccolo San Francesco da Cupertino, puoi condividere un framework assicurandoti sempre che venga utilizzato solo in quel preciso modo che hai definito (cioè senza bruciare le uova) e senza permettergli di vedere il sistema utilizzato (la tecnica per cuocere le uova).

Premessa fatta. Vediamo insieme come creare un framework con Xcode 8!

Il progetto

Creare un framework per iOS è qualcosa di relativamente semplice. Esiste già un Template preconfezionato che ti permette di partire da un progetto bello e pronto. Apri Xcode, crea un nuovo progetto di tipo Cocoa Touch Framework

creare-un-framework-per-ios-con-xcode

Il template porta con se alcuni file, che per il momento, puoi benissimo tralasciare.

progetto-framework-xcode-8

Classi private e public

Qui si vede con leva maggiore l’importanza dell’utilizzo dei modificatori di visibilità spiegati nel corso gratuito sul linguaggio Swift e poi ripresi nel corso iOS.

Dato che il framework potrebbe essere destinato al grande pubblico è importante definire a priori quali debbano essere le classi/metodi/variabili ecc utilizzabili dallo sviluppatore finale.

Una classe marcata come private è accessibile solo dall’interno del modulo di riferimento (cioè solo dall’interno della “cartella” in cui inserirai i file del framework). Una classe marcata come public sarà usufruibile dal progetto che implementerà il framework. Se la classe viene marcata con uno di questi due access modifier anche tutti i suoi metodi e attributi diventano tali. Tranne nel caso in cui non venga esplicitato direttamente il modificatore.

Di default un’istruzione ha il modificatore internal cioè è accessibile solo all’interno del modulo. Quindi se vorrai renderla public o private dovrai forzarlo con un modificatore d’accesso.

Aggiungi una nuova classe al progetto ed inserisci il seguente codice:

La classe è marcata come public quindi sarà accessibile dal progetto che implementerà il framework. Dall’altro lato, al suo interno, ci sono var/func public e private. Le private non saranno utilizzabili dall’esterno mentre le public si. Ovviamente il public interno poteva essere omesso dato che la classe è di default public. L’ho inserito solamente per capire velocemente questa differenza.

Compilare ed Esportare

Dove trovo il file .framework e come lo importo?

Per creare il file finale, cioè quello con estensione .framework, una volta aggiunte le varie classi ti basta cliccare su Product/Build per compilare il progetto. 

compilare-un-framework-xcode-8

Il file NomeFramework.framework puoi recuperarlo cliccato con il tasto destro sul file omonimo che trovi dentro il progetto e selezionando Show in Finder:

show-in-finder-nuovo-framework-xcode

A questo punto ti basterà prendere il file e trascinarlo nel progetto in questione.

Dal progetto dell’applicazione ti basterà eseguire un normalissimo import nomeFramework nei vari file in cui vorrai utilizzarlo.

Progetto App e Framework insieme

Moltissime volte è utile poter lavorare al progetto del framework e contemporaneamente vedere come funziona all’interno di un progetto reale (per esempio in un’applicazione). Il sistema che ti ho fatto vedere sopra, cioè della compilazione e del trascinamento del framework all’interno del progetto dell’app è noioso e fa perdere un sacco di tempo ogni qual volta devi aggiornare il framework.

A questo punto puoi utilizzare un sistema ingegnoso che ti permette di lavorare contemporaneamente al framework e all’applicazione.

In un progetto qualsiasi di un’applicazione, dal Project Navigator, seleziona la cartella e con il tasto destro seleziona Add file to “Nome progetto”. Spostati nella cartella in cui hai creato il framework ed aggiungi il file con estensione .xcodeproj:

framework-progetto-e-app-progetto-xcode

Alla fine della solfa dovresti avere il progetto del framework all’interno del progetto dell’applicazione:

framework-xcode-e-linguaggio-swift

condividi xcoding

Ho impiegato un po’ di tempo a scrivere questo tutorial. Se ti va, ricambia il mio lavoro, con un like alle mie pagine!

Grazie ;)

Link al framework

Da qui come si utilizza il framework?

Per poter utilizzare il framework dal progetto dell’applicazione, spostati nel Project Info sul pannello General. Scendi in fondo alla pagina e, dove trovi Embedded Binaries clicca sul tasto + ed aggiungi il file nomeFramework.framework. Automaticamente dovrebbe comparire il framework anche su Linked Frameworks and Libraries:
come-creare-un-framework-con-xcode-e-linguaggio-swift

Utilizzo

L’utilizzo è analogo all’esportazione del file .framework in maniera normale. Nel caso in cui non ti dovesse far importare il framework, prova a compilare il target Framework. Cioè dal campo vicino al tasto di avvio del progetto (quello a forma di triangolo) seleziona il target NomeFramework ed avvia la compilazione.

Alla fine dovresti poter importare correttamente il framework ed utilizzare tutto ciò che c’è di pubblico lì dentro:

utilizzo-framework-custom-xcode

Considerazioni

Per quanto riguarda la distribuzione del framework con Cocoa Pods o altri sistemi né parlerò in un tutorial tutto dedicato all’argomento.

Una cosa che ti raccomando di fare è quella di pensare al framework come qualcosa di riutilizzabile. Non crearlo se non è riutilizzabile in N progetti. Cioè, se quello che ogni volta farai sarà modificare il framework in base alle esigenze del progetto in cui lo implementerai, vorrà dire che starai sbagliando ad impostarlo.

A tal proposito, se il progetto è da distribuire, il framework dovrebbe fare un uso massiccio dei Generics, ne ho parlato in questo tutorial, onde evitare tutti i problemi legati al casting.

Buona Programmazione!

Changelog

  • 14/11/2016 – Aggiunto il changelog.

About
Classe 1993. Sono uno studente di ingegneria informatica a Catania, un istruttore di arti marziali ed un libero sognatore. Mi sono avvicinato al mondo della programmazione all'età di 15 anni per motivi che è meglio far rimanere segreti. Oggi passo il mio tempo a studiare e realizzare applicazioni per i dispositivi Apple, diffondendo ciò che imparo sul mio portale xCoding.it. Quando non scrivo sul blog lo faccio per la rivista bimestrale ioProgrammo.

Start typing and press Enter to search