Come diventare un programmatore iOS Swift

In molti mi chiedono come poter diventare programmatori iOS e quali sono i passi da fare.
Il mio consiglio ad oggi è quello di concentrarsi sul linguaggio di programmazione Swift al fine di averne la piena conoscenza.

Sono convinto che questo linguaggio si espanderà molto fino ad arrivare anche su altre piattaforme in modo produttivo e quindi conoscerlo ed averne la maestria sarà un grande vantaggio.

Ma perché proprio Swift?

Il nuovo linguaggio ideato da Apple sta riscuotendo un grandissimo successo ma alla base c’è una scelta ponderata. Ad oggi Swift è il linguaggio di programmazione di default per i sistemi Apple, non obbligatorio ma con il tempo il supporto ad Objective-C sarà sempre meno frequente.

Questo non significa che non dobbiate conoscere almeno i principi di programmazione Objective-C. Anzi, sarà fondamentale per comprendere alcuni framework e per poter essere in grado di lavorare anche su codice più datato.

Se il vostro obiettivo è quello di lavorare nel mondo delle applicazioni iOS dovrete essere preparati nel caso in cui vi sarà richiesto di mettere le mani su applicazioni già esistenti che nel 90% dei casi saranno scritte in Objective-C.

I primi passi da fare

Questo articolo è scritto per chi ha già una base di conoscenza della programmazione ad Oggetti e dei pattern più usati come MVC (Model-View-Controller).

A questo punto potete addentrarvi nel magico mondo Apple e la prima cosa da fare è studiare la documentazione sull’architettura di iOS.
Una volta appresa potete passare alle linee guida di design di iOS e come ultima parte le linee guida del Review Team che per renderla più interessante e alla portata di tutti, Apple ne ha anche creato una versione a fumetto.

A questo punto potete passare allo studio dei linguaggi di programmazione, Swift e Objective-C.

Libri

Il primo libro da leggere è sicuramente la Guida di Apple su Swift che è possibile anche avere in versione iBook, totalmente gratuito.

Una volta presa dimestichezza con il linguaggio potete iniziare e leggere il libro Advanced Swift: Version 2 di objc.io che personalmente lo reputo una piccola perla insieme a Functional Swift: Updated for Swift 3  sempre di objc.io. Questi due libri hanno un prezzo di $ 39,00 l’uno.

Da tenere presente anche i libri di Ray Wenderlich che spaziano dallo sviluppo di applicazioni fino a quello di videogiochi.

Video

Ogni anno Apple organizza la WWDC (World Wide Developer Conference) che è un evento molto importante per ogni sviluppatore. All’interno di questo evento vengono solitamente presentati i nuovi sistemi operativi e le ultime tecnologie. Durante i 5 giorni vengono fatti degli speech su argomenti ben precisi riguardanti le novità appena introdotte. Potete vedere quindi tutti i loro video sul portale Apple Developer.

Alla Stanford University ogni anno organizzano un corso di sviluppo iOS che poi mettono a disposizione a chiunque, lo trovate a vostra disposizione su iTunes.

Anche l’Università di Pisa ha organizzato un corso di sviluppo iOS, non è aggiornato all’ultima versione ma è comunque molto utile. Potete trovarlo anch’esso su iTunes.

Anche Ray Wenderlich nel suo ottimo archivio ha molti video corsi interessanti e che dovete assolutamente vedere.

Corsi

Ci sono moltissimi corsi di formazione per il mondo iOS sia online che offline. Non ho mai avuto l’opportunità di conoscere le persone che li organizzano quindi non so dirmi qual’è il migliore. Vi faccio un elenco di quelli più famosi.

Un progetto molto interessante e che personalmente seguo è Talks.io sempre dei ragazzi di objc.io dove trattano argomenti specifici in Swift cercando di insegnare e discutere sulle soluzioni migliori da adottare durante lo sviluppo.

Se invece siete di Pisa, Lucca, Livorno o d’intorni, nel corso del 2017 ci saranno novità riguardanti lo sviluppo di applicazioni iOS al Talent Garden di Pisa. Se siete interessati a corsi, workshop e seminari potete iscrivervi alla newsletter e riceverete le novità al riguardo.

Blog

Anche di blog che parlano di sviluppo iOS e Swift ce ne sono tantissimi. Personalmente seguo gli issues di objc.io (anche se ad oggi non stanno portando avanti il progetto) e il blog di Ray Wenderlich.

Da tenere sempre a portata di mano è il blog di Apple su Swift così come il blog We ♥ Swift.

Come ultima risorsa ma non meno importante vi consiglio di tenere a portata di mano il link delle Risorse per gli sviluppatori di Apple dove potete trovare sempre le ultime novità.

Se avete domande o ogni altra necessità potete sempre contattarmi.

Apple conferma: stanno lavorando ad una auto Driverless

E quindi Apple conferma, con una lettera alla Us national highway traffic safety administration, che sta lavorando a veicoli autonomi.

La fonte è SkyTG24 che con un articolo sul sito ci lascia sognare. Il documento che Apple ha inviato è intitolato: Apple’s Comments on the Federal Automated Vehicles Policy.

E quindi cosa dobbiamo aspettarci? Personalmente credo che dovremmo attendere ancora molto prima di vedere davvero qualcosa di funzionante o meglio, qualcosa di venduto al grande pubblico.
Certo è che a sentire i vari rumors sembra che Apple ci sta lavorando da vari anni.

Personalmente non se so prendere questa notizia in modo positivo o negativo perché sono un grande sostenitore della teoria “fai una cosa e falla fatta bene” di cui Steve Jobs mi sembra ne fosse un grande portavoce.
Cioè secondo me un’azienda non dovrebbe distaccarsi troppo dal suo core-business. Apple è un’azienda che fa computer e software. Già con iPhone, iPad, Apple TV e Watch si è distaccata molto dal suo focus.

Andare quindi ad intaccare anche un settore enorme come quello delle auto mi sembra un azzardo molto grande. Non dico che ne sarebbe in grado, ma forse stanno allargando troppo il focus e rischiano di tralasciare qualcosa (un po’ come sta accadendo con i Macintosh che vengono aggiornati sempre più lentamente).

Mi riservo quindi ancora del tempo per capire se tutta questa espansione può giovare al mercato e ad Apple oppure no.

Certo che se dovessero innovare nel settore delle auto come lo hanno fatto nel 2007 in quello della telefonia ci sarà da divertirsi davvero!

 

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.