Qué lenguaje debo aprender para hacer aplicaciones tanto para Android como para iPhone?

Puedes usar html y JavaScript para hacer una aplicación híbrida usando herramientas como Cordova o Phone gap. Esto dará lugar a una aplicación nativa con sólo una webview que contiene su página web. Se llama híbrida porque no utiliza el sdk de android o ios para crear las vistas. Este es el mejor enfoque si usted ya conoce el desarrollo web, no está utilizando demasiadas características de os (porque a veces la integración de ellos será un dolor) y usted don't necesita la apariencia exacta de una aplicación nativa. Ten en cuenta que con este método tienes que codificar el gráfico sólo una vez.

También puedes escribir en c# una aplicación nativa envuelta usando Xamarin. Xamarin viene con un wrapper 1to1 completo del SDK de android e iOS, por lo que tendrás que usar las vistas nativas para hacer tu pantalla. En mi opinión este es el mejor enfoque porque ahorrarás tiempo al compartir la lógica de negocio y utilizarás el 100% del potencial del sdk nativo y las librerías de terceros.

Xamarin viene también con un wrapper adicional llamado xamarin forms que envuelve los gráficos nativos. Esto requerirá que escribas el gráfico para ambas plataformas una sola vez (el wrapper utilizará la vista nativa correspondiente), pero es muy limitado y debe ser utilizado sólo para propósitos de prototipo o para aplicaciones en las que la belleza de la interfaz de usuario no es un gran problema.

De todos modos, si la lógica de negocio de tu aplicación es muy pequeña, es mejor que pienses dos veces antes de utilizar un desarrollo compartido, ya que xamarin viene con un alto nivel de abstracciones que puede necesitar más tiempo que escribir las aplicaciones dos veces. Tendrás un proyecto que contenga la lógica del núcleo y dos proyectos diferentes para las otras plataformas y todo tendrá que tener una interfaz en el núcleo y dos implementaciones (no para la solución del formulario, por supuesto). ¡Estos tiempos bajarán si usas alguna librería de inyección como Ninject pero eso's algo que necesitarás practicar!

Otro enfoque puede ser desarrollar aplicaciones nativas (java y swift) y compartir la lógica de negocio en una librería de c++, pero es muy desafiante porque necesitarás conocer 3 lenguajes además de JNI para que c++ hable con java

Así que, para recapitular:

Aplicación híbrida

  • Lógica compartida
  • Gráfica html compartida
  • Difícil de integrar llamada al SO

Xamarin

  • Lógica compartida
  • Vistas nativas separadas
  • ..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!