Il modo più tradizionale per implementare un’app mobile (sia essa destinata ad iOS, Android e/o altre piattaforme) è quello di utilizzare i vari SDK e framework offerti dai produttori stessi del sistema operativo per cui vogliamo sviluppare. Se decidiamo di creare un’app per Android, potremo utilizzare Java o Kotlin, ed i relativi SDK. Allo stesso modo, i linguaggi Swift ed Objective C ci permetteranno di creare app per iOS. In questi casi, quello che facciamo solitamente è realizzare un’app nativa, che sfrutta cioè le caratteristiche messe a disposizione direttamente dagli SDK, potendo quindi interfacciarsi con le varia funzionalità del sistema operativo ospitante.
Un’app nativa, generalmente, ha il vantaggio di poter accedere direttamente alle funzionalità del sistema operativo, e non necessita di livelli di astrazione o middleware aggiuntivi. Per questo motivo, questa soluzione è preferita da molti sviluppatori che abbiano a cuore le performance dell’app. Tuttavia, oggi più che mai è molto comune trovare la stessa versione di un’app su diverse piattaforme, soprattutto Android ed iOS. E se siamo interessati a posizionarci sia sul mercato Android che su quello iOS, l’approccio nativo potrebbe non essere la soluzione migliore. Esso, infatti, ha lo svantaggio di richiedere due codebase distinte, che nei fatti si traducono nella necessità di sviluppare (e manutenere) due app strutturalmente diverse, per quanto simili possano essere le funzionalità da esse fornite.
La prima soluzione a questo tipo di problema, che trova tuttora larga applicazione in molti casi, è quella di realizzare unicamente web application, ottimizzandone l’accesso da parte dei dispositivi mobili. Di fatto, ciò si traduce nel realizzare siti web responsivi e particolarmente ottimizzati per il mobile, che però hanno poco a che vedere con le app. Tali web application richiedono infatti un qualsiasi browser mobile per la fruizione, soffrendo di limitazioni legata all’impossibilità (salvo poche eccezioni) di accedere a tutte le funzionalità che il sistema operativo ospite fornisce ad una qualsiasi app nativa.
Per risolvere quest’altro problema, sono state presto introdotte le cosiddette app ibride, intendendo con tale aggettivo la coesistenza ed integrazione di funzionalità native con caratteristiche proprie delle web application. I più semplici esempi di app ibride consistono nell’uso di un componente nativo in grado di visualizzare pagine web (ad esempio, nel caso di Android, una WebView), e di una web application che viene automaticamente visualizzata tramite tale componente nativo. La web application può essere sia embedded (ovvero inclusa nell’app, in forma di sito statico e in locale), oppure remota (cioè installata su un web server, ed accessibile solo mediante una connessione web). Quest’ultimo caso permette, inoltre, di visualizzare la stessa web application di volta in volta su piattaforme diverse, dal momento che un’app “contenitore” (sia essa su Android o su iOS) può accedervi facilmente via HTTP.
L’approccio ibrido ha il vantaggio di limitare al minimo la necessità di manutenzione dei componenti nativi (dal momento che tutta la logica è implementata nella web application), mentre il grosso della manutenzione è (almeno idealmente) unico per entrambe le piattaforme. Inoltre, questo approccio facilita la fase di implementazione e manutenzione del codice a chi proviene dal mondo dello sviluppo web. D’altro canto, le performance di un’applicazione ibrida non possono essere paragonate a quelle di un’app nativa, poiché quest’ultima non richiede l’esecuzione di alcun interprete JavaScript o motore di rendering HTML/CSS, che invece rappresentano i middleware aggiuntivi (il cui onere computazionale non è trascurabile), incorporati in qualunque componente per la visualizzazione di pagine web.
Per superare anche il problema delle performance delle app ibride, negli ultimi anni si sono affermati diversi framework per lo sviluppo di app multipiattaforma che utilizzano un approccio ancora diverso. Anziché creare app ibride, tali framework utilizzano un unico linguaggio di programmazione per la definizione dell’app, che può poi essere convertita in una implementazione adatta alle varie piattaforme supportate (tra cui sono sempre presenti anche Android ed iOS). Alcuni esempi (tutti già trattati su HTML.it) sono i seguenti:
- Appcelerator Titanium, che utilizza JavaScript come linguaggio di sviluppo
- Xamarin, basato invece su C#
- Flutter, che sfrutta un linguaggio appositamente sviluppato, chiamato Dart