Quale lingua dovrei imparare per fare applicazioni sia per Android che per iPhone?

Puoi usare html e JavaScript per fare un'applicazione ibrida usando strumenti come Cordova o Phone gap. Questo risulterà in un'applicazione nativa con solo una webview che contiene la tua pagina web. Questo è chiamato ibrido perché non usa l'Android o l'iOS per creare le viste. Questo è l'approccio migliore se si conosce già lo sviluppo web, non si stanno usando troppe caratteristiche dell'os (perché a volte integrarli sarà un dolore) e non si ha bisogno dell'esatto aspetto di un'applicazione nativa. Notate che con questo metodo dovete codificare la grafica solo una volta.

Potete anche scrivere in C# un'applicazione nativa wrapped usando Xamarin. Xamarin è dotato di un wrapper 1to1 completo dell'SDK di Android e iOS, quindi dovrete usare le viste native per creare il vostro schermo. A mio parere questo è l'approccio migliore perché risparmierete tempo condividendo la logica di business e utilizzerete il 100% del potenziale dell'sdk nativo e delle librerie di terze parti.

Xamarin è anche dotato di un ulteriore wrapper chiamato xamarin forms che avvolge la grafica nativa. Questo richiederà di scrivere la grafica per entrambe le piattaforme solo una volta (il wrapper userà la vista nativa corrispondente), ma è molto limitato e dovrebbe essere usato solo per scopi prototipali o per applicazioni in cui la bellezza della UI non è un grosso problema.

In ogni caso, se la logica di business della vostra applicazione è molto piccola, è meglio pensarci due volte prima di usare uno sviluppo condiviso, poiché xamarin presenta un numero molto elevato di astrazioni che potrebbero richiedere più tempo che scrivere le applicazioni due volte! Avrete un progetto contenente la logica di base e due progetti diversi per le altre piattaforme e tutto dovrà avere un'interfaccia nel nucleo e due implementazioni (non per la soluzione del modulo, ovviamente). Questi tempi scenderanno se userete qualche libreria di iniezione come Ninject, ma è qualcosa che dovrete praticare!

Un altro approccio può essere quello di sviluppare applicazioni native (java e swift) e condividere la logica di business in una libreria c++, ma è molto impegnativo perché dovrete conoscere 3 linguaggi oltre a JNI per far parlare c++ con java

Quindi, per ricapitolare:

App ibrida

  • Logica condivisa
  • Grafica html condivisa
  • Difficile da integrare chiamata OS

Xamarin

  • Logica condivisa
  • Viste native separate
  • ..but every thing in c#

Xamarin forms

  • Shared logic
  • Shared native view in c#
  • Less view customisation (but you can always mix form with native)

C++

  • Shared logic
  • Hard to wrap
  • Separate native views in java and objc/swift

EDIT: there is also React Native that uses html and give birth to a true native app, not hybrid. I never used it but from this input it can be worth trying if you already know html!