city-cars-traffic-lights

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!

 

screen_1

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!

code_pills_01

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!

screen-shot-2016-10-26-at-12-19-04

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!