Oggi nessun articolo di programmazione e niente inglese maccaronico.
Vorrei parlare in realtà di una funzionalità a mio avviso molto interessante presente in iOS8.
A volte può essere utile inserire nel vostro telefono informazioni che siano leggibili a tutti in caso di emergenza senza compromettere la privacy di altre, in pratica aprire una piccola finestra in cui far sbirciare piuttosto che aprire la porta di casa.

Read more!

Finally I had enough time to start working on SWIFT, AFSwiftDateExtension is an NSDate extension that makes working with date an easy task.

Read more!

From iOS7 everything now is about blur. In iOS7 it wasn’t easy to blur a view in “real time”, there are a lot of libraries on GitHub that can  (almost) do that.
On iOS8 Apple came to rescue enabling the UIVisualEffectView.

Let’s see how to implement it.

Read more!

One thing that I love about Obj-C and Cocoa is how seamlessly Apple is introducing funcionalities to take advantage of multicore devices.
One of the most common things that a dev does by hourly basis is enumerate a collection.
In Obj-C we can takle this with different approaches:
1 – old plain C for/while loops
2 – fast enumeration protocol (the for..in)
3 – Create an NSEnumerator object from the collection
4 – Use enumeration methods declared in the object interface

The 4th approach is present in almost each kind of collections and one of its methods is the

- (void)enumerateObjectsWithOptions:(NSEnumerationOptions)opts usingBlock:(void (^)(id obj, BOOL *stop))block

The opts parameter is a bit mask where we can pass this really interesting option:

NSEnumerationConcurrent

As the name states this makes the enumeration process a concurrent task and it’s a pleasure to see in instruments the 2 cores working all togheter. There is one caveat as stated by Apple engineers “the code of the block must be safe against concurrent invocation”.

One other stuff that I really love is the way we can help thread safety using blocks.
Recently for a social-instagram-like app I needed to use extensively the AFNetworking library.
To take trace of the networking operation created by each view controller I created a sort of register of the living connection.
The problem in this scenario is the async nature of the process related to the networking tasks. After adding an operation to the register, is impossible to know when it will be  finished (and consequently removed from the register) and this could happen while adding another one the register. We need to put things in order.

To help us we can use a thread locking mechanism,  I’ve found really uselfull the dispatch_barrier mechanism that has less overhead compared to an exclusive lock.

First we need to create our concurrent queue.
In the reading method we create a synch block that waits for the reading to end, if more cores are avalaible more reading request can occur, in the writing method we use a barrier to be sure that no other code has access until the writing finishes. Since GCD queue are executed in first in – first out order we can guarantee that the block would be executed in the same order we have requested.
As you can see from the picture (taken from the book Effective Obj-C 2.0) while the writing block is executing no reading (or writing) can happen.

Read-Write process

Read-Write process

In code is pretty much something like that.

First we create a our concurrent queue

syncQueue = dispatch_queue_create("it.shootshare.registeroperation", DISPATCH_QUEUE_CONCURRENT);

Then we override our properties:

- (NSString*) name {
  NSString * __block aName = nil;
  dispatch_sync(syncQueue, ^{
     aName = _name;
  });
  return aName;
}

- (void) setName:(NSString*)aName {
   dispatch_barrier_async(syncQueue, ^{
     _name = aName;
  });
}

I don’t want to start explaining what is “the internet of things” because it’s a really huge topic, but I’m here to share my first experience into connect an iOS device to a micro controller called Pinoccio and what that means.

What is Pinoccio? am I missing an “H”?

Is really hard to describe it, I’m really proud about being a funder of this project on indiegogo.

Pinoccio at a first first look seems to be like a pumped Arduino with a WiFi shield and mesh radio communication. If you are wondering.. yes is compatible with the Arduino IDE and you can compile your own custom firmware, but do we really need that? Building a firmware with the Arduino IDE that include a network library, shield communication can be really frustrating, if you are not familiar with micro-controllers, is really a long hard road. For instance the memory is a big problem into creating a sort of web-server that can run into a micro-controller.
One of my first desire when I ‘ve got my first iPod Touch was to connect my device on everything and when I started to build my own applications using the iphone sdk, I always tried to figure out how to do that, but I’ve found huge obstacles that I wasn’t still prepared to tackle.
In the earlier realeses of iOS version wasn’t possible to connect the iphone to a sort of prototype board, well not exactly but I have should enroll to the made for iphone/ipod program and the process wasn’t really easy. The accessory framework had very few documentation available to the public. Now we can use the Bluetooth LE to connect with an accessory but it seems to be locked for 1:1 connection (but I’m not totally sure about it, for instance the multipeer connectivity can connect up to 8 devices).
Then I started to use Arduino a little, but the problem was still the connection between the 2 devices, the only option was using the ethernet shield, build something like a webserver and access Arduino pins with a sort of web services. Not so easy and also with a lot of limits about memory, bottlenecks etc in my mind I couldn’t find a way to do something that could be ready for production.

Later Redspark started to sell a cable (in compliance with the made for iphone program). With this cable is possible using the serial communication to make an Arduino talk with an ios device, but under current Apple policy this cable may not be used with apps sold on the App Store.

Then I’ve found ElectricImp, I was really interested into that project but when I heard that I would always need to stay bounded to their cloud platform I gave up, but the Imp is a really cool device if you accept that limitation (or feature).
On Febraury 2013 during an Indiegogo campaign I heard about Pinocc.io it was love at first sight.

Pinoccio image

Pinoccio with all its features

Why Pinoccio changes everything?

  • It is a really small and cool prototyping board.
  • They are making an FCC certified version for production of a size of a nail.
  • You can build you own firmware in the old Arduino way.
  • You can use a scripting language to communicate with it from a web terminal (and via REST).
  • You can log it and launch those script commands using REST webservices.
  • You are not bound to use their platform.
  • You can create your own mesh of pinocc.ios and only one of them need to comminicate WiFi.
  • You can create your own custom script (maybe because you need to communicate in a specific way with a sensor or peripheral)
  • It’s all wireless
Pinocc.io Web interface

Pinocc.io Web interface

It’s pretty clear that you can do almost everything you want.

The idea here is to send all your request to their (or yours) platform and read or write properties with simple calls on the the platform, and this is a reallu smart idea, because most probably the platform manages the traffic on the board, maybe also caching some responses, avoiding bottle necks or massive requests.

To make a simple example about how this board connected to you iOS device can be powerful, I’ve made an easy app that asks the on-board temperature of the two scouts.
We have a lead scout (Optimus Prime) with the Wi-Fi backpack on it and the other scout (Bumble Bee) that communicates through the lead scout.
The lead scout is installed in my home and the other outside – of course the on board temperature is not the real environment temperature because is due to the load of the CPU and the environment temperature itself-.

Pinoccio temperature app

A video can be found here.

This is a simple example but let me try to figure out something bigger.

Let’s imagine that each scout has a Bluetooth LE backpack and a simple OLED display installed in a shoes shop. Each shoes has its own scout (like a price tag) with the display that shows the like/reviews numbers.
Each scout sends an iBeacon signal to identify a specific product close to them. When a user get close to the product using the shop application connects to that scout/ibeacon and get the product details, there is also the possibility to “like” it, once the use press like on the phone the like number on the display is incremented almost in real-time.
The other interesting example could be to measure the energy consumption of our house integrating a hall effect sensor on each scout and display data in a cool web page or into your mobile phone.

Arduino in my opinion created a revolution opening the market to all those boards, these is just the beginning because the revolution of the DIY is cultural and educational.
I hope to have more time to play around using Pinocc.io and this is the first time that I feel I have something “ready for production” and not just a new cool R&D gadget.

L’annuncio degli iBeacon sembra aver scosso un po’ il mercato mobile, come se questi oggetti fossero un qualcosa di magico che consente di fare un po’ tutto, dalla geolocalizzazione indoor, ai pagamenti, dalla casa intelligente, a retail experience. Il limite è sempre la fantasia, basta che questa sia poi effettivamente supportata da una sufficiente conoscenza del dispositivo in questione per capire cosa è effettivamente realizzabile.
Diversi “esperti” di marketing si sono cimentati nello spiegare cosa è un iBeacon e voglio provarci anche io, dato che a tempo perso ci sto giochicchiando.

Read more!

La pirateria – e forse dico una cosa scontata – è un grosso problema anche per iOS.

Nel mondo del Jailbreak esistono AppStore fittizi dove è possibile scaricare gratuitamente copie di app che normalmente si trovano a pagamento.

Il tipo di utenza che usufruisce di questo servizio è divisibile in due macro-categorie:

a. persone che non compreranno mai la tua app

b. persone intenzionate all’acquisto, ma che desiderano provarla prima di investire i loro soldi nel tuo prodotto 

Riguardo al successivo pagamento da parte degli utenti tipo b. non bisogna farsi molte illusioni: sono davvero pochi coloro che regolarizzano la loro posizione andando sullo store virtuale di Apple.

Lo scenario è, dunque, tutt’altro che roseo. Un’ulteriore complicazione viene anche dalla natura stessa delle applicazioni. Questo genere di prodotti ha, infatti, una vita brevissima di utilizzo-medio, con il tangibile rischio che la ”prova” gratuita coincida perfettamente con il termine di utilizzo. Detto questo le app hanno anche costi rappresentativi del loro effettivo utilizzo. Apple, inoltre, non fornisce alcun periodo di trial sui prodotti distribuiti attraverso l’AppStore.

Come accade per altri settori, anche le tecniche per evitare la pirateria sulle app sono molto complesse, facilmente aggirabili e dall’elevata possibilità di creare un danno anche a chi l’applicazione l’ha regolarmente acquistata. Questo a causa di falsi positivi che possono essere causati anche per una semplice sostituzione del device. Non dimentichiamoci, poi, che Apple non vincola l’applicazione al dispositivo sul quale è stata scaricata, ma all’account dell’utente che l’ha acquistata.

Esistono soluzioni al problema? Una tecnica ottimale sarebbe quella di verificare se effettivamente l’utente ha effettuato l’acquisto, richiedendo una sorta di ricevuta digitale. Con iOS7 è stato introdotto un set di nuove API che consentono di ottenerla (anche se – a dire il vero – il sistema era comunque disponibile già con Lion). La classe è in oggetto SKReceiptRefreshRequest , interessante vero? Peccato che la verifica dello scontrino digitale sia ancora una procedura particolarmente complessa.

La ricevuta digitale sarebbe anche utilizzabile nel passaggio da applicazione a pagamento ad applicazione con modello freemium, in questo modo sarebbe possibile fornire a chi ha già pagato un set superiore di risorse.

La speranza è che venga rilasciata una qualche utility che renda l’analisi più snella (esiste già una lib su GitHub, che comunque richiede diverse conoscenze nell’ambito di certificati etc). O il danno economico diventerà sempre meno gestibile.

Ci siamo lasciati dall’ultimo evento di Apple con alcune previsioni sensate (articolo keynote Apple 10 settembre).

Successivamente ho espresso il mio disappunto (riflessioni sulla presentazione dei nuovi iPhone) di fronte al fatto che tutti i prodotti mostrati (ottimi prodotti) non avessero suscitato in me un particolare stupore o sorpresa anche a causa dei continui leaks da parte dei produttori cinesi.

Domani presteremo nuovamente la nostra attenzione all’evento organizzato da Cupertino, con il suo “We still have a lot to cover”. Dunque, cosa dobbiamo aspettarci dalla presentazione di Apple? Ci sarà una sorpresa?

Partiamo dal keynote precedente, quello del 10 settembre. Se la linea iPhone è stata rinnovata, sono, invece, mancati all’appello gli iPad. Per questi sono previsti aggiornamenti hardware e nel caso della versione “grande” è previsto un cambio abbastanza radicale dello chassis che lo renderà molto più simile al mini. Riguardo a quest’ultimo, è altamente probabile che la speranza di molti di veder integrato un display retina verrà frustrata.

Il nome dato all’evento ha un che di sibillino: “We still have a lot to cover”. Come è noto, “cover” in inglese significa anche custodia… Per associazione potremmo ipotizzare che si sia di fronte a una produzione multicolore come per l’iPhone C. In fondo – come è accaduto il 10 settembre – anche questa volta il manifesto di lancio dell’evento è supercolorato…

Tutto qui? Assolutamente no!

Apple dovrà stupirci ancora con lo splendido Mac Pro rivelandone – fra le altre cose – il costo e con la nuova release di OSX che dopo anni abbandona la famiglia dei felini per trasformarsi in Mavericks (come uno dei luoghi californiani più amati dai surfisti).

Sono, inoltre, previsti aggiornamenti hardware per i MacBook Pro con i nuovi processori Haswell di Intel (più potenti e dal minor consumo di batteria), per i MacMini e per Apple TV

Insomma, tutto procederà da piano o avremo qualche (bella) sorpresa?

Ma sopratutto: che il mio pendolino sia davvero migliore di quello del compianto Maurizio Mosca

IOS7 è uscito, lo sappiamo e molti di noi lo hanno già installato. Il nuovo sistema operativo rappresenta un cambiamento radicale rispetto al 6, un cambiamento necessario per svecchiare un prodotto che rischiava di essere visto come “datato”, specie se confrontato con quelli proposti da concorrenti che, con il trascorrere degli anni, hanno saputo produrre sistemi operativi molto accattivanti.

Non parlerò delle funzioni di iOS7, delle quali è stato detto già abbastanza. Voglio guardare “il dietro le quinte” e ripercorrere le trasformazioni che iOS7 ha subito negli ultimi mesi, dalla developer preview 1 fino al rilascio ufficiale odierno. Un’altra maniera per capire il modus operandi di Apple, fra tentativi, certezze e modifiche dell’ultima ora.

Per noi sviluppatori iOS7 rappresenta “un problema” anzi, due problemi. Il primo è il missmatch creativo che si è creato tra sistema operativo e applicazioni “vecchie” che per lo più utilizzavano lo scheumorfismo.

Il secondo sono le API e il nuovo modo di “vedere” le applicazioni.

La questione ha due risvolti, entrambi da considerare.

Senza dubbio per innovare, è necessario guardare avanti e, nel caso, prendere decisioni unilaterali, di forza, in maniera che tutti vi si adeguino senza negoziare. Lasciando troppa libertà si corre il rischio che ognuno continui sulla sua vecchia strada, implementando API vecchie. Una nota personale: è da tempo che mi riprometto di imparare bene il linguaggio “Ruby”, ma ad ogni rilascio di sistema operativo mi vedo costretto a ricominciare a studiare tutto daccapo.

Apple è decisamente coerente con quello che dice e fa; alcuni elementi dell’interfaccia grafica standard sono stati macellati da diversi sviluppatori (me compreso) per accontentare le richieste di clienti a cui non piaceva il pop up bluetto perché non in linea con i colori aziendali. Da Cupertino, infatti, non si smetteva di sconsigliare modifiche a tali componenti, avvertendo che release future avrebbero potuto generare cambiamenti, con il rischio di dare vita a comportamenti inaspettati con l’applicazione di questi hack… Insomma tutti ne erano consapevoli tanto ieri come oggi.

 

Tuttavia, se la filosofia che sta dietro a determinate scelte è comprensibile, le vie che propone per renderla operativa sono talvolta meno limpide.

Parliamo del minimalismo dell’interfaccia grafica di iOS7. È chiaro che questa scelta non è fine a sé stessa come su altri sistemi (una pura questione estetica, di gusto), ma propedeutica al contenuto e al contesto presentato, animazioni incluse.

Meno chiaro, invece, la maniera attraverso la quale trasformare il concetto in qualcosa di reale, attraverso la programmazione. Infatti, benché iOS7 preveda che tutte le app compilate debbano utilizzare come area lo schermo intero, ad oggi sembra non esistere un modo semplice per cambiare questa azione e renderla simile ad iOS6. Una scelta che ha fatto letteralmente impazzire un certo numero di sviluppatori. Capita che le “vecchie” applicazioni ricompilate vengano visualizzate con un layout diverso e con i contenuti che “scivolano” sotto la status bar. Un problema non da poco per chi come me sta lavorando per implementare animazioni di transizione diverse da quelle standard tra una sezione e un’altra senza usare gli strumenti forniti da Apple.

Non c’è dunque da stupirsi se il forum ufficiale della Mela morsicata è animato da discussioni visitate da migliaia di persone. In pratica, con questa scelta, si obbliga lo sviluppatore da una parte a “ridisegnare” gran parte del layout e dall’altra a tenere sempre presente la bicompatibilità con il vecchio sistema.

Gli stessi ingegneri Apple si sono dimostrati non esattamente all’altezza: le loro risposte ancora latitano e quando arrivano, non sono del tutto esaustive, soffermandosi su un solo modo di programmare , talvolta utilizzato da una percentuale minima dei programmatori. Intanto anch’io mi sono cimentato, proponendo una soluzione che riduca l’impatto sulle ore di lavoro e mantenga la retrocompatibilità con il 6. La speranza è che funzioni.

 

Il confronto con i programmatori ha portato Apple ha fare alcuni importanti correttivi. Dai primi giorni di settembre è possibile scaricare anche le versioni vecchie per quelle app che hanno interrotto la compatibilità con i precedenti sistemi operativi.

Nel nostro caso stiamo sviluppando un update per un nostro prodotto, iEtiquette che sarà compatibile solo con iOS7. Mentre per chi non avesse o potesse aggiornare sarà comunque possibile scaricare la versione precedente. Questa è una scelta di importanza enorme perché favorisce sia sviluppatori che utenti.

Il cambiamento, come dicevo all’inizio di questo post è radicale. Sicuramente qualcuno si lamenterà. Negli ultimi giorni ho letto di diverse polemiche riguardo ad aggiornamenti  di applicazioni a pagamento che – con il pretesto del passaggio al sistema 7 – dovranno essere pagate di nuovo dagli utenti che le avevano a suo tempo scaricate. Un caso eclatante – notizia di oggi – riguarda il task manager CLEAR che nella nuova versione iOS7 compatibile richiede ben 3 euro.

L’effort per rendere una app compatibile con iOS7 è molto elevato e per applicazioni complicate (CLEAR non è tra queste) è abbastanza normale che gli sviluppatori richiedano un pagamento. Il problema è che non è possibile fissare un prezzo di update, o gratis o tutto. D’altra parte ritengo che sia normale che un’applicazione supporti gratuitamente un solo sistema operativo. È una situazione che nel mondo desktop viviamo tutti i giorni (è probabile che qualcuno se ne approfitti, avvelenando il mercato).

 

Altre sorprese passate in sordina sono la possibilità di scaricare app in 3G fino a 100MB (prima il limite era di 50MB) e che un’applicazione per iPhone su iPad userà le risorse per retina display e verrà visualizzata a quasi tutto schermo, con un miglioramento sull’usabilità davvero notevole.

 

In attesa delle novità Apple, alcune previsioni e un paio di riflessioni.

Sono passati 3 mesi circa dalla presentazione di iOS7 e OSX Mavericks e in questo periodo si sono susseguite un’infinità di immagini inerenti al fantomatico iPhone low cost e all’ iPhone 5S. In realtà niente di sorprendente. I primi leak di questi modelli risalgono già ai primi mesi del 2014. È possibile che Apple non sia più in grado di stupirci? (come si è detto nel precedente articolo http://cloudintouch.it/2013/09/05/apple-e-la-capacita-di-inventare-il-futuro/). Senza dubbio l’ufficio marketing di Cupertino è abile a creare un “clima di attesa” intorno ai nuovi prodotti attraverso un gioco di mezze verità e un po’ di smentite. Tuttavia, è anche evidente un grosso problema di sicurezza interna. Basti pensare che  le immagini dei primi iPhone 5 furono mostrate prima della presentazione del 4s.

Read more!