Category Archives: Xcode

Tool: un plugin Xcode per la creazione automatica di grafi delle dipendenze

Tempo fa, ero alla ricerca di un tool per disegnare grafici che rappresentassero le classi e le dipendenze tra i vari componenti nei miei progetti Xcode. Non trovai alcuno strumento automatico. Vi era questo “Graphviz” ma non mi aveva soddisfatto a pieno. L’altro strumento era di una software house texana se non vado errato, di cui non ricordo più il nome, ma che costava ben 400$, mentre la versione demo dello stesso software costava ben 50$. Ma quello che non mi ha spinto a provarlo, è il fatto che il loro sito web sembrava antecedente al 1995. In quell’occasione, dovetti fare tutto a mano, utilizzando OmniGraffle. Fu un incubo. Continue reading Tool: un plugin Xcode per la creazione automatica di grafi delle dipendenze

10 librerie per iOS che ho amato nel 2014

Quando mi sono avvicinato al mondo dello sviluppo iOS, circa 3 anni fa, provenivo dal mondo Java, e nonostante fossi un utilizzatore di tecnologie Apple di vecchia data, l’idea che mi ero fatto, per opinione comune, era che lo sviluppo su dispositivi Apple fosse un mondo chiuso, costituito dai “soli” framework offerti da Apple. In realtà, 3 anni dopo, posso smentire questa idea comune. Esistono una miriade (parola per nulla abusata in questo caso) di librerie, disponibili per iOS. Ce ne sono per tutti i gusti, e anche di eccezionale qualità. Per quantificare quanto voglio affermare, vi basti sapere che nel 2014 che sta per concludersi, Objective-C è l’11° linguaggio più popolare su GitHub. E nel conto non è stato preso in esame Swift. Continue reading 10 librerie per iOS che ho amato nel 2014

Gli strumenti INDISPENSABILI di uno sviluppatore iOS

Mi occupo principalmente di sviluppo applicazioni mobile, in particolar modo di app iOS (iPhone e iPad). Ovviamente il mio lavoro richiede alcuni strumenti di cui non posso fare a meno o che dall’inizio della mia esperienza con lo sviluppo di applicazioni mi risultano indispensabili per essere veloce, preciso e attendo, e ottimizzare ciò che faccio. Di seguito voglio elencare una lista di software (per OS X) e di Web Services che utilizzo spesso per svolgere il mio lavoro, e che ottimizza la mia produttività. Questa lista è in continuo aggiornamento, perché magari passo ad altro, oppure aggiungo qualche software all’elenco. Nominerò solo i più importanti, quelli che reputo realmente indispensabili. Chiaro, ci sono software minori come Skype, Pocket ed simila, che tornano utili, ma che non sono prettamente legati allo sviluppo. Detto ciò, iniziamo con la lista, e nei commenti fatemi sapere i vostri software indispensabili per il vostro lavoro! Continue reading Gli strumenti INDISPENSABILI di uno sviluppatore iOS

Message “No identities are available for signing” when you want to publish an app on App Store

Yesterday, i have finished developing an update for my application “YFC“, and when it came time to send the update to the App Store, Xcode has returned the following error: “No identities are available for signing“.

ERROR No identities are available for signingI thought it was an error related to certificates, but it was not.

On the internet I found several solutions to the problem, but they were too long to do, so I found a loophole faster, so that I could send the update as soon as possible.

The best solution I’ve found is this, proposed by AppDeveloperMagazine.

Basically: export the application for Ad Hoc Deployment, and load it on the App Store via Application Loader. For me the solution worked and saved me a lot of time.

To the next.

Paolo

Mantenere dati e preferenze di un’app iOS quando l’utente effettua un aggiornamento da App Store

Ho di recente iniziato a sviluppare un’app di ricette per iOS, e come ogni buona app di questo tipo, vi è la possibilità di inserire una ricetta tra i preferiti.

Anche se la questione può sembrare semplice, in realtà la cosa è più complicata di quanto si pensi.

Analizzando il problema in profondità, dal punto di vista di uno sviluppatore, vi è il problema dell’aggiornamento dell’app.

Se io, utente, aggiorno la mia applicazione, e tra i preferiti avevo salvato 10 ricette, dopo l’aggiornamento, che fine fanno i preferiti? E’ lecito pensare, dal punto di vista di uno sviluppatore, che un aggiornamento comporti l’eliminazione della vecchia versione dell’app, dopodiché l’installazione della nuova release.

Questo problema, che può sembrare banale, in realtà non è così semplice. Ho dovuto cercare e alla fine capire da solo come risolvere il problema. Nemmeno Apple, nella sua documentazione, accenna al problema.

Andrò quindi ad analizzare la mia situazione, che può essere utile praticamente per tutte le app che necessitano della persistenza dei dati,  anche dopo un aggiornamento dell’app stessa tramite app store.

Analisi

L’applicazione sul quale ho affrontato il problema è così strutturata: ho un file .plist, contenente le mie ricette. Il plist è composto da un array, l’array al proprio interno contiene N dictionary, ognuno dei quali identifica una ricetta. Ogni dictionary (quindi ogni singola ricetta) ha al proprio interno i campi che costituiscono la ricetta (titolo, ingredienti, preparazione, categoria, etc…).

Questo .plist, verrà aggiornato di volta in volta dallo sviluppatore (da me), quando viene rilasciato un aggiornamento dell’applicazione su app store. E’ palese il fatto che NON possiamo inserire in questo caso un nuovo campo booleano “preferito” all’interno di ogni ricetta, poiché il file verrà sovrascritto durante l’aggiornamento, e quindi se l’utente aveva inserito delle ricette tra i preferiti, dopo l’aggiornamento tutti i campi “preferito” tornerebbero a FALSE, in sostanza: abbiamo perso tutti i preferiti.

plist app ricette

File System

Per comprendere a fondo il problema, è essenziale capire come funziona il file system su iOS.

La documentazione ufficiale di Apple, spiega in modo chiaro e semplice il funzionamento del file system.

In breve, ogni applicazione ha una Sandbox, ovvero un ambiente dove effettuare operazioni di IN/OUT, dove vi è la possibilità di memorizzare qualsiasi tipo di file. Lo sviluppatore, NON può accedere al di fuori della Sandbox, e ogni app ha una propria Sandbox.

sandbox di ios

All’interno della Sandbox, vi sono cinque directory, utili allo sviluppatore per lo storage dei dati. Di seguito vi è una traduzione italiana, presa da devapp, di ciò che trovate sulla guida ufficiale Apple.

ios File System directory

Siccome si presume che le nostre preferenze, che vogliamo ritrovare dopo ogni aggiornamento dell’app, siano anche “backuppate” da iTunes, dobbiamo utilizzare in questo specifico caso la directory “Documents”.

Aggiornamento da App Store

Come funziona l’aggiornamento di un’app secondo Apple? iTunes scarica l’aggiornamento in un una nuova directory, dopodiché sposta i dati contenuti nelle directory sopra elencate, dalla vecchia versione dell’app alla nuova. Se nella nuova versione dell’app, all’interno della directory Documents, viene scritta una nuova versione del nostro file (ad esempio del .plist contenente le ricette), automaticamente viene eliminata la vecchia versione. Ecco spiegato il perché non possiamo inserire i preferiti all’interno di ricette.plist. Non possiamo accedere contemporaneamente alla vecchia e alla nuova versione del file per fare un merge, dobbiamo adottare un’altra soluzione.

La soluzione

La soluzione è un secondo file (in questo caso ho utilizzato un altro .plist chiamandolo “Preferiti.plist”).

file preferiti plist struttura

In questo file, strutturato come un Dictionary contenente un solo Array di nome HandSet (che al suo interno conterrà solo tipi String), memorizzerò i titoli di ogni singola ricetta (o gli ID). Se la ricetta è all’interno di questo file, significa che è tra i preferiti, e se aggiornerò il file Ricette.plist, non dovrò occuparmi di quali ricette sono tra i preferiti o meno, perché è in un file a parte. Questo significa che se una ricetta era tra i preferiti, rimane dov’è, e all’utente viene data la possibilità di inserire nuove ricette tra i preferiti.


//Dichiaro la path del file Preferiti.plist presente nel bundle, che sarà

//successivamente scritta in Documents (all'interno della sandbox)

NSString *finalPath = [[NSBundle mainBundle] pathForResource:@"Preferiti" ofType:@"plist"];

/* PERMETTE DI SCRIVERE IL FILE "Preferiti.plist" NELLA CORRETTA CARTELLA "Documents" DELLA SANDBOX */

NSFileManager *fileManager = [NSFileManager defaultManager];

NSError *error;

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *DocPath = [documentsDirectory stringByAppendingPathComponent:@"Preferiti.plist"];

if ([fileManager fileExistsAtPath:DocPath] == NO) { //se Preferiti.plist non esiste (è la prima volta che l'app viene aperta) lo scrive.

[fileManager copyItemAtPath:finalPath toPath:DocPath error:&error];

NSLog(@"SCRITTO FILE INIZIALE Preferiti.plist");

}

//se invece è un aggiornamento, non deve fare nulla, perché significa che già esiste un file Preferiti.plist nella directory Documents

Quando effettuiamo un’operazione sul file .plist, dobbiamo stare ben attenti a prelevare ciò che era già presente al suo interno, dopodiché effettuare un merge tra i vecchi dati e quelli che stiamo andando ad inserire (in questo caso, un nuovo preferito). Sui file .plist non possiamo semplicemente aggiungere un oggetto, in quanto ogni volta che richiameremo

[dati writeToFile:path atomically:YES];

verrà creato e scritto un nuovo file (e se già presente, il vecchio sarà sovrascritto).

//AGGIUNTA DI UN NUOVO VALORE IN PREFERITI.PLIST
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *DocPath = [documentsDirectory stringByAppendingPathComponent:nomePlist];

NSMutableDictionary *addData = [NSMutableDictionary dictionaryWithContentsOfFile:DocPath];

NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:DocPath];

NSArray *oldHandsets = [dict valueForKey:@"HandSet"]; //vecchi dati presente in preferiti.plist

NSArray *newHandsets = [[NSArray alloc]initWithObjects:@"nuovo preferito string", nil]; //nuovo oggetto-array di oggetti da inserire tra i preferiti

NSMutableSet *mergeHandsets = [NSMutableSet setWithArray:oldHandsets];

[mergeHandsets addObjectsFromArray:newHandsets]; //merge dei dati (vecchi e nuovi)

//aggiungo i nuovi oggetti al plist, nell'Array di nome HandSet

[addData setObject:[mergeHandsets allObjects] forKey:@"HandSet"];

//scrivo il nuovo file con i cambiamenti apportati

[addData writeToFile:DocPath atomically:YES];

E per eliminare un dato?


 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *DocPath = [documentsDirectory stringByAppendingPathComponent:nomePlist];

    NSMutableDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:DocPath];

    NSMutableArray *dataFromPlist = [dict valueForKey:@"HandSet"];

    [dataFromPlist removeObject:@"string da rimuovere"];

    [dict setObject:dataFromPlist forKey:@"HandSet"];

    [dict writeToFile:DocPath atomically:YES];

Ovviamente, prima di cancellare un dato dovete assicurarvi che sia presente, quindi tocca a voi gestire tutte le varie eccezioni che potrebbero essere generate.

Utilizzando questo sistema, possiamo memorizzare delle preferenze o un qualsiasi tipo di dato (e non per forza un file .plist), senza perdere informazioni durante un aggiornamento eseguito tramite app store.

Se questa guida ti è stata utile, fammelo sapere nei commenti! 😉

Cheers!

Video corso Gratuito alla programmazione di Applicazioni per iOS [Università di Pisa]

Segnalo che il Dipartimento di Informatica dell’università di Pisa, in collaborazione con Data Port-Apple Solution Expert, ha organizzato un corso di Sviluppo di Applicazioni per iOS, il sistema operativo sviluppato da Apple per iPhone, iPod touch e iPad. Il corso è tenuto dal Prof.Goran Djukic – Istituto di Fisiologia Clinica – CNR, e le lezioni sono molto ben articolate e dettagliate, corredate di video in alta risoluzione (oppure in formato SD) e delle slide correlate al corso. Ovviamente i video sono in lingua italiana, ed il corso è completo, scaricabile gratuitamente da iTunes U.

“Applicazione SuperEnalotto” – parte 8 del videocorso su Objective C [videocorso]

Dopo il Model View Control, nell’ottava lezione del videovideo corso gratuito di Objective C, iMakeApps propone la realizzazione dell’Applicazione SuperEnalotto.
L’APP che ci genera la sestina da poter puntare al famoso gioco del SuperEnalotto e tentare la fortuna.
Nel video viene spiegato passo passo la realizzazione dell’APP, spiegando ogni linea di codice, fino ad arrivare al test sull’emulatore di Xcode 4.
Chi possiede la licenza apple potrà anche scaricare e provare l’applicazione sul proprio iPhone.
Chi desidera il codice sorgente, può chiederlo gratuitamente sul sito: www.imakeapps.it, dal pannello richiesta info.

Ecco a voi i video di questa nuova (bellissima) lezione:

Xcode 4 Keyboard Shortcuts [PDF document]

The Xcode 4 Keyboard Shortcuts are now available. Colin Wheeler decided to make forking it and creating your own version easier by putting it up on Github. This will make it easier to browse forks and merge new formats in. Additionally it makes it easy to have a consistent go to place that doesn’t change for updates to the shortcuts.
Here, however, find the version for Xcode 3.
Continue reading Xcode 4 Keyboard Shortcuts [PDF document]

“Model View Controller” – parte 7 del videocorso su Objective C [videocorso]

E’ online la settima lezione di Objective C proposta gratuitamente sul canale YouTube da iMakeApps.it.
In questa lezione viene trattato il Model View Controller, il paradigma fondamentale che sta alla base della programmazione iPhone.
Vengono trattate in dettaglio le tre entità fondamentali:
– Model, che rappresenta la struttura di un’applicazione.
– Controller, rappresenta come l’applicazione viene visualizzata.
– View rappresenta gli elementi grafici messi a disposizione dall’ambiente di programmazione.
Continue reading “Model View Controller” – parte 7 del videocorso su Objective C [videocorso]

“Foundation Framework” – parte 6 del videocorso su Objective C [videocorso]

E’ online la sesta lezione di Objective C proposta gratuitamente sul canale YouTube da iMakeApps.it.
Dopo aver visto nella quinta lezione la prima applicazione per iPhone e iPad: “Hello World”, quest’oggi trattano: ” il Foundation Framework”.
Ovvero analizzano la libreria di base dell’Objective C, presentando le classi per la manipolazione di Stringhe, Array, Tabelle di Hash e Set.
Inoltre mostrano delle funzionalità avanzate del linguaggio, come la Fast Enumeration per itererare su collezioni di dati e le Property List molto usate in ambiente Mac.
Continue reading “Foundation Framework” – parte 6 del videocorso su Objective C [videocorso]