Pagine

2013-04-01

Due target nello stesso progetto

Ok, le App a pagamento sono spesso sinonimo di garanzia: se riceve soldi, lo sviluppatore sarà più invogliato a mantenere la propria applicazione ed a correggerne i bachi.
Però l'utente, prima di acquistare, vorrebbe provare l'applicazione, spesso se questa è costosa. Mantenere una App gratis, con funzionalità ridotte può spesso valere la spesa: una volta che si è verificato che risponde a quello che stavamo cercando, possiamo acquistare quella completa.

Per lo sviluppatore, questo significherebbe portare avanti due progetti, con tutti i difetti del caso: doppio debug, doppia correzione di bachi,... A meno che non sfruttiamo Xcode! Possiamo infatti ottenere due o più applicazioni, solo utilizzando i target di Xcode (qui utilizziamo XCode 4, ma funziona con tutte le versioni).

Cominciamo quindi con l'aprire un progetto esistente (uso un progetto di prova chiamato CocoaApp); nella parte sinistra della finestra clicchiamo sul progetto, rivelando le sue impostazioni: nella seconda colonna vediamo una sezione PROJECT ed una TARGETS: i target indicano i prodotti del progetto, cioè le applicazioni (ora ne vedremo una sola con lo stesso nome del progetto):


Ora, facciamo un bel click destro e nel menu che ne esce scegliamo Duplicate. Il risultato sarà di avere un nuovo target CocoaApp copy, che viene selezionato:



Vediamo che le info del nuovo target sono identiche a quello di partenza, salvo il nome: certo, non rilasceremo mai una App con un copy in fondo al nome! Per cui, per prima cosa clicchiamo in alto su Build Settings e poi scriviamo PRODUCT_NAME nel campo di ricerca. Verranno visualizzate solo le righe che contengono la stringa; un doppio click sul campo corrispondente a questo parametro e inseriamo il nome del prodotto che vogliamo nel popup che viene fuori:


Ora cliccando su Summary, vediamo che l'Identifier è quello corretto: com.dominio.CocoaApp-Free.
Lo spazio viene automaticamente riempito con un trattino.
Tuttavia, nella colonna a fianco, il nome del target è ancora quello vecchio: niente paura, un click sul nome del target, entriamo in edit e lo modifichiamo.
Diamo ora un'occhiata alla colonna contenente i file: vediamo che in fondo è stato creato un nuovo Info.plist file: ovvio, visto che si tratta di una nuova App; però anche questo ha il nome sbagliato. Facciamo come prima: click sul nome e inseriamo quello corretto; poi portiamo il file nel gruppo giusto, con un drag&drop:


Non abbiamo ancora finito di mettere in bella il nuovo target: infatti, guardiamo in alto a sinistra, dove c'è un menu CocoaApp - My Mac 64 bit: aprendolo troviamo una nuova voce che si chiama ancora CocoaApp copy! Allora, dallo stesso menu, scegliamo la voce Manage Schemes...: si aprirà una finestra, in cui vediamo lo schema incriminato: click e lo editiamo al nuovo nome:


Vedremo che nel menu ora compare il nome giusto! Quindi possiamo dedicarci al codice!
Di sicuro vorremo togliere funzionalità nella versione free, ma vogliamo anche tenere lo stesso codice, in modo da correggere i bachi una volta sola, giusto?
Per fare questo, abbiamo bisogno di dire al compilatore cosa inserire e cosa no: è proprio un lavoro per le macro preprocessor! Si tratta quindi di definire una macro per la versione Free e poi nel codice verificare se tale macro è definita o meno.

Per la definizione di questa macro (la chiameremo FREE) il posto più semplice sono parametri di compilazione; per cui click sul progetto a sinistra, poi click su Build Settings. Nel campo di ricerca in alto scriviamo PROCESSOR e alla voce Preprocessor Macro inseriamo FREE (ovviamente va bene qualsiasi nome, ma questo identifica bene cosa vogliamo ottenere):


Naturalmente dovrà essere inserito sia per la configurazione Debug che Release!

Finalmente siamo pronti per passare al codice.
Certamente vorremo che la finestra rispecchi il nome dell'applicazione, pur usando un solo xib. Nel nostro xib la finestra avrà titolo "CocoaApp" e nel delegate inseriremo il codice:


- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
#ifdef FREE
[self.window setTitle:@"CocoaApp Free"];
#endif
}


Il codice di impostazione del titolo sarà eseguito solo quando andremo a compilare la versione free; la compilazione di una o dell'altra versione avverrà selezionando il target corrispondente e lanciando (o archiviando) il progetto!

NOTA: ogni tanto si trova su internet il consiglio di partire creando un nuovo target; solo che poi dovrete associare al nuovo target tutti i file, ovviamente dimenticandone qualcuno... La cosa più semplice è invece di duplicare il target iniziale: dovrete soltanto occuparvi di cambiare alcuni nomi, come abbiamo fatto e basta.
Anche la definizione della macro può essere fatta inserendola in un header comune, ma questa via mi sembra la più semplice.

Nessun commento:

Posta un commento