Tag Archives: iOS

La mia alternativa al pessimo UIAlertController di Apple: PMAlertController

Prefazione: Yep, è passato qualche mese dal mio ultimo articolo qui sul blog (oops…) ma mi farò perdonare raccontandovi per l’ennesima volta la bugia che tornerò con frequenza a scrivere. Perciò zero lamentele e godetevi questo nuovo articolo, che stasera sono ispirato.

Spesso un sacco di progetti open source partono con l’intenzione di migliorare qualcosa, oppure come lodevoli iniziative per introdurre piccole soluzioni dirette, che semplicemente funzionano. Continue reading La mia alternativa al pessimo UIAlertController di Apple: PMAlertController

GiveAway: l’app che permette di ridare vita agli oggetti in disuso, cercando e regalando l’usato

Esiste un movimento mondiale, sconosciuto ai più, che nel giro di 10 anni ci permetterà di rendere il mondo più sostenibile, grazie al riuso e al riciclo degli oggetti. Oggi guardavo un video del TED, in cui Chris Anderson intervista Elon Musk: per chi non lo conoscesse, è l’imprenditore che sta dietro Testa Motors, SpaceX, Paypal, e tanti altri progetti che hanno e stanno rivoluzionando il mondo, sotto molti punti di vista. Continue reading GiveAway: l’app che permette di ridare vita agli oggetti in disuso, cercando e regalando l’usato

6 Consigli Per Promuovere La Tua App Prima Del Lancio

Una volta che ti sei deciso a lanciare un nuovo prodotto sul mercato è necessario promuovere la tua app. Il mercato difficilmente si accorgerà di te senza qualche opportuna tecnica di marketing. L’esposizione necessaria per la tua app può essere realizzata anche prima dell’uscita sullo store. Fai sapere alle persone della tua app, in anticipo.

Di seguito, elenco qualche suggerimento che ti tornerà sicuramente utile. Continue reading 6 Consigli Per Promuovere La Tua App Prima Del Lancio

Facebook’s iOS Infrastructure

Facebook has been iterating its mobile products, continuing to increase the richness of the content and speed at which it is delivered. In transitioning to become a mobile-first company, Facebook has faced complex issues and opportunities to make its products more innovative, while building abstractions to do so that are powerful, yet simple—all fit for a very large scale.
Continue reading Facebook’s iOS Infrastructure

Quanto Costa Sviluppare Un’App Mobile

Quando si parla di costi di un prodotto software, “vago” è il termine esatto da utilizzare. Nessuno può dire quanto tempo e denaro il progetto porterà via. Ad ogni modo, se stai pianificando di lanciare una startup, un’applicazione per presentare il tuo business, oppure un prodotto enterprise interno, o hai bisogno di un software per qualsiasi altro scopo commerciale, è necessario pianificare il tuo budget. Quindi vorrai sapere quanto costa sviluppare la tua applicazione mobile oppure il tuo sito web. Nessuno ti dirà esattamente quanto verrà a costare, ma dovrai cercare di avvicinarvi il più possibile al tuo budget.

Se hai un’idea, ma non hai alcuna esperienza sull’assunzione di persone che sviluppano software, questo percorso sarà particolarmente ostico, perché dovrai cercare i finanziamenti, ed è necessario stabilire delle scadenze, bisogna sapere quanto tempo è necessario per lo sviluppo, i costi per il marketing, e come quello che andrai a fare impatterà sul ROI.
Hai bisogno di sapere quando il prodotto sarà pronto, in maniera tale da programmare il lancio al momento giusto.

Continue reading Quanto Costa Sviluppare Un’App Mobile

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

Le Ricette di Martina 2.0

Dopo un po’ di tempo dall’ultima release, è su App Store l’aggiornamento 2.0 delle Ricette di Martina, l’applicazione realizzata in collaborazione con Martina Toppi. C’è voluto un po’, in quanto ho voluto effettuare un refactoring generale del codice che avevo scritto oltre un anno fa, quando le mie capacità su Objective-C non erano affatto quelle di oggi. Continue reading Le Ricette di Martina 2.0

Swift è bello, ma bisogna prima conoscere Objective-C

Apple ha stupito tutta la sua comunità di sviluppatori quando ha annunciato Swift, un nuovo linguaggio di programmazione per applicazioni OS X e iOS, progettato per essere veloce, moderno e semplice da imparare limitando la quantità di codice necessario per sviluppare software, e debuggando il codice in maniera semplice.

Con la crescente popolarità dei linguaggi di scripting dinamici come Ruby e Python, ha senso che Apple faccia questo salto con Swift. Continue reading Swift è bello, ma bisogna prima conoscere Objective-C

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!

Your Fortune Cookie 1.2 rilasciato

E’ con grande piacere che comunico a tutti i lettori del blog il rilascio della versione 1.2 di Your Fortune Cookie. Non ho avuto ancora modo di parlarne qui, quindi questo è il momento giusto per farlo.

Your Fortune Cookie è la mia prima applicazione gratuita sviluppata per iOS, che porta i biscotti della fortuna allo step successivo. Le altre apps presenti su App Store erano troppo scarne, con poche funzionalità e una grafica blanda. YFC invece offre una bella grafica (realizzata da @tancro), un database di frasi selezionate in continua crescita (e per di più bi-lingue, italiano-inglese), la dettatura vocale (bi-lingue), la condivisione sui social network e le notifiche locali per ricevere il proprio biscotto della fortuna ogni giorno sul proprio iPhone.

L’aggiornamento 1.2 di YFC include le seguenti funzionalità e correzioni:

  • ✔  200 nuovi biscotti in lingua italiana
  • ✔  200 nuovi biscotti in lingua inglese
  • ✔  Introdotto pulsante per visualizzare la frase precedente
  • ✔  Notifiche locali
  • ✔  Nuovo font delle frasi
  • ✔  Splash screen
  • ☂ Risoluzione di bug minori

Potete scaricare YFC direttamente dall’App Store, gratuitamente!