IconRecolor si rifà il look

Visto il successo che ha avuto l’applicazione IconRecolor per macOS ho deciso di portare avanti lo sviluppo dell’app in modo continuativo.

Con la versione 1.0.3 ha acquistato un nuovo look, più moderno e fresco, nonché una nuova icona, colorata e vivace.

favorites

Inoltre ho aggiunto la funzionalità di salvataggio dei Colori Favoriti. Ora possiamo salvare tutti i colori delle nostre palette così da avere preset pronti da utilizzare velocemente.

Insomma, IconRecolor sta crescendo velocemente grazie anche ai vostri feedback.

Grazie a tutti!

Swift 3 e la Configurazione Remota

Oggi parleremo di Configurazione Remota o anche Remote Configuration, ma cosa è?

Prendiamo come esempio l’applicazione Costituzione Italiana. Questo genere di progetto ha al suo interno alcune tecnologie basilari come Google Analytics, Arena Daemon e altri servizi esterni.
Cosa accade se ad un certo punto volessi disattivarne uno? Esatto, dovrei fare una nuova build e inviarla ad Apple.

Se volessi fare dei test A/B sarebbe un vero dramma.

La soluzione è avere una configurazione remota. L’app quindi prima di avviare i servizi controlla un file di configurazione remoto ed applica i comportamenti indicati.

Sul mio server ho inserito un piccolo file JSON:

{
	"enableGoogleAds": true,
	"enableGoogleAnalytics": true
}

L’app quindi si comporterà in base a questi due valori.

A questo punto non ci rimane che scrivere il codice Swift e per l’occasione ne approfitteremo per iniziare a scrivere qualcosa nella sua ultima versione, la 3.

Creiamo quindi una classe chiamata RemoteConfiguration.
Dovrà utilizzare il pattern Singleton così da avere una singola istanza per tutta la vita della nostra app.

class RemoteConfiguration {
	static let sharedInstance = RemoteConfiguration()
}

Aggiungiamo poi una proprietà chiamata baseURL:URL che andremo a configurare in un secondo momento. Poi ci serve un metodo che ci permette di recuperare il file. Questo è il momento giusto per utilizzare una callback, quindi creiamo un metodo chiamato configuration e come argomento deve accettare una closure di questo tipo: (dictionary:[String:AnyObject]))->().

class RemoteConfiguration {
	static let sharedInstance = RemoteConfiguration()
	var baseURL:URL?

	func configuration(handler:@escaping (_ dictionary:[String:AnyObject]?)->()) {

	}
}

La logica che ho pensato è questa: Se i dati non sono mai stati scaricati vado a recuperarli dall’URL indicato,  se invece li ho già scaricati non farò alcuna chiamata al server ed utilizzerò i dati in memoria.
Per farlo serve una proprietà privata configurationDictionary in cui salveremo i dati.

class RemoteConfiguration {
	static let sharedInstance = RemoteConfiguration()
	var baseURL:URL?

	private var configurationDictionary:[String:AnyObject]?

	func configuration(handler:@escaping (_ dictionary:[String:AnyObject]?)->()) {

	}
}

Adesso andiamo a creare la magia.
Per convenienza ho scritto una piccola classe chiamata Request che si occupa di scaricare i dati dalla rete in modo asyncrono, la troverete nel file Playground.

Request ritorna un oggetto Data che andremo a convertire in un dizionario usando la classe JSONSerialization e il metodo jsonObject.
Questo metodo solleva un’eccezione ma in questo momento non ci interessa controllare l’eventuale errore e quindi  possiamo utilizzare try? in modo da avere un oggetto Optional. In alternativa avremmo dovuto utilizzare un blocco do {} catch {}.

class RemoteConfiguration {
	static let sharedInstance = RemoteConfiguration()
	var baseURL:URL?
	
	private var configurationDictionary:[String:AnyObject]?
	
	func configuration(handler:@escaping (_ dictionary:[String:AnyObject]?)->())
	{
		guard let baseURL = baseURL else { assertionFailure("URL cannot be nil"); return }
		
		if let configuration = configurationDictionary
		{
			handler(configuration)
		}
		else
		{
			Request.url(url: baseURL, completion: {
				data, error in
				
				if let data = data, error == nil
				{
					if let json = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String:AnyObject]
					{
						handler(json)
						return
					}
				}
				
				handler(nil)
				
			})
		}
	}
}

È arrivato il momento di provare il nostro codice, configuriamo RemoteConfiguration e richiediamo i dati:

let rc = RemoteConfiguration.sharedInstance
rc.baseURL = URL(string: "http://localhost/pills/p-01/remote-config.json")
rc.configuration { configuration in
	if let configuration = configuration
	{
		debugPrint(configuration)
	}
}

Se tutto è andato bene dovremmo vedere nel debugger la stampa del dizionario:

["enableGoogleAds": 1, "enableGoogleAnalytics": 1]

Questa classe è un ottimo punto di partenza nella nostra implementazione di una configurazione remota. Personalmente la trovo davvero molto utile per fare test A/B e per attivare o disattivare funzionalità o servizi senza dover ricompilare tutto.

Ovviamente è un punto di partenza, ci sono molte ottimizzazioni da poter fare e funzionalità da implementare. Potrebbero essere argomento nei prossimi articoli.

Potete scaricare il file Playground da GitHub.

Happy coding!

Icon Recolor su Mac App Store per macOS

Poche settimane fa ho messo la mia Applicazione per ricolorare le icone IconRecolor su Mac App Store.

Ho ricevuto buoni feedback e sto continuando lo sviluppo dell’app aggiungendo nuove funzionalità.

Ho appena inviato la versione 1.0.1 che introdurrà la possibilità di inserire il codice esadecimale (HEX) del colore scelto e la possibilità di rimuovere un’icona dalla lista delle icone scelte.

L’app è scaricabile per 79 centesimi su Mac App Store: https://itunes.apple.com/it/app/iconrecolor/id1167485078?l=en&mt=12.

 

ImageSlideShow uno Slideshow Controller in Swift per iOS

Ho deciso di iniziare a condividere parte del mio codice su Github per migliorare le mie skills su Swift e per aprirmi ad un mondo nuovo, quello dell’OpenSource.

Ho quindi fatto l’upload del progetto di ImageSlideShow, un ViewController che fa da Slideshow per le immagini.

Il suo funzionamento è molto basilare ma è applicabile in pratica a qualsiasi applicazione.
Trovate tutte le informazioni su Github.

Di lavoro ce né ancora molto ma sono comunque soddisfatto. Spero che apprezziate e che iniziate ad utilizzarlo.

Happy coding!

Quanto costa e come realizzare un’applicazione per iOS o per Android

Ho deciso di riprendere l’argomento che avevo già trattato in passato perché nel frattempo sono cambiate molte cose e quindi è necessario aggiornarsi.

Il mercato delle applicazioni per SmartPhone (iPhone, iPad, Android in generale) si è espanso e nel frattempo sono nati nuovi tipi di dispositivi come i Tablet, gli SmartWatch e le SmartTV.
Ad aggiungersi sono nate anche nuove tecnologie di sviluppo che ci permettono di abbassare drasticamente i costi.

Fino a 5-6 anni fa mettere un’app in uno Store, sia App Store che Google Play, ci dava la certezza di avere dei buoni download ed una buona visibilità, la concorrenza non era così spietata e quindi potevamo pensare ad avventurarci in questo mondo a fronte di un costo abbastanza elevato ma comunque con dei ritorni quasi certi.

Oggi le cose si sono invertite. Sviluppare un’app non è più così costoso o almeno ci sono metodi che permettono di far risparmiare molto ma è altrettanto molto difficile avere dei buoni dati di download e quindi dei buoni profitti.

È necessario quindi affrontare il progetto in modo più intelligente e più orientato al marketing.

Come realizzare un’app?

Qui entra in gioco la prima parte, come poter sviluppare un’applicazione affinché funzioni realmente, sia apprezzata dal pubblico e permetta di avere quei profitti tanto desiderati.
Intanto alla base deve esserci un buon piano marketing che dia la giusta visibilità al progetto.

Dopo di che è necessario affidarsi ad un Team di sviluppo adeguato, che sappia analizzare correttamente l’app e il progetto da realizzare e sappia prendere le giuste decisioni. Queste infatti si rifletteranno sia in modo imminente durante la vendita dell’app sia in seguito durante la sua manutenzione nel tempo.

Ci sono fondamentalmente due metodi per fare un’applicazione:

Realizzarla in modo Nativo

  • Significato
    • Sviluppare l’applicazione utilizzando sia il linguaggio di programmazione che l’SDK della casa costruttrice del dispositivo. Per iOS significa sviluppare con i linguaggi Objective-C o Swift utilizzando direttamente l’SDK di Apple. Per Android invece significa sviluppare con il linguaggio Java utilizzando l’SDK di Google.
  • Pro
    • Le applicazioni realizzate in questo modo sfruttano al 100% l’hardware di ogni device, senza alcun limite. Significa poter realizzare praticamente ogni cosa (con i limiti del caso), accedere ad ogni risorsa e avere a disposizione tutta la potenza dei device.
  • Contro
    • Ogni versione dell’app, iOS e Android, devono essere sviluppate indipendentemente ed è necessario avere degli sviluppatori o un Team competente per le due risorse, i costi quindi sono più alti.

Realizzarla in modo Ibrido

  • Significato
    • Sviluppare l’applicazione utilizzando un linguaggio ibrido come il linguaggio di programmazione Web (HTML, CSS, Javascript). Questo viene interpretato da un browser che simulerà il comportamento di un’applicazione nativa.
  • Pro
    • Le applicazioni realizzate in questo modo hanno il privilegio di poter essere sviluppate usando un codice unico che poi sarà compilato per ogni device. I costi vengono ridotti dal fatto di poter realizzare un’unica applicazione che poi girerà su ogni dispositivo.
  • Contro
    • Proprio per la sua caratteristica di simulazione questo genere di applicazione è più limitato e quindi ha un accesso alle risorse e alle prestazioni limitato.

Il Team di sviluppo al quale vi rivolgerete dovrà scegliere quale metodo utilizzare in base al tipo di applicazione.
Personalmente preferisco lavorare in modo Nativo per poter sfruttare a pieno ogni device e poter realizzare un’app davvero innovativa ed unica. Ma queste decisioni comunque sono da prendere in base al progetto, al budget e a molti altri aspetti.

Quanto costa realizzare un’app?

Come abbiamo visto prima il costo cambia in base al metodo di sviluppo.
Ma ci sono anche altri aspetti da valutare. Intanto partiamo con il dire che tutto dipende dal tempo che servirà per realizzarla.
Di base, più complessa è l’app e più tempo servirà, quindi il costo sarà maggiore.

I punti da analizzare sono:

  • Funzionalità di network (i dati saranno presi dal web? dobbiamo gestire utenze (login/registrazione)?
  • Interfaccia grafica: Realizzazione grafica
  • Interfaccia grafica: Realizzazione esperienza utente (animazioni, funzionalità grafiche particolari, schermate per la manipolazione dei dati, ecc.)

Questi tre punti sono quelli che inizialmente possono influire sui costi.
Implementare funzionalità di rete complesse come la registrazione utente necessitano di tempo (tempo di analisi, di sviluppo e di testing).
Anche creare interfacce grafiche complesse aumentano il tempo di sviluppo, invece utilizzare la UI di sistema è più economico; non in tutti casi è la scelta migliore.

Un altro fattore da valutare è il Team di sviluppo. Più esperienza c’è e meno tempo utilizzeranno per realizzare il prodotto e quindi sarà possibile sia risparmiare che investire il tempo per creare un prodotto migliore.

È vero, non sempre è così, anzi molti grandi aziende che si occupano di sviluppo applicazioni hanno costi davvero alti. Ma vale la pena farsi fare un’analisi e un preventivo.

E quindi quanto costa? Impossibile dirlo senza sapere cosa c’è da realizzare ma posso sbilanciarmi dicendo che per un piccolo progetto è necessario almeno un mese intero di lavoro, per una singola versione Nativa (iOS o Android) o per le due versioni in modo Ibrido.

Ovviamente lo sviluppo di un software è molto più complesso di quello che ho descritto qui sopra, ma volevo darvi un’idea delle cose che dovete prendere in considerazione nel momento in cui volete sviluppare un’app per la vostra azienda o un’app per un vostro progetto.

Se avete necessità di fare un preventivo potete scrivermi.