¡Nueva aplicación publicada en Google Play! Por primera vez en meses publico una aplicación nueva, en lugar de actualizar las existentes. Te cuento qué librerias he utilizado, qué problemas he tenido y qué he aprendido en el camino.
More...
¿Qué es Hackeando Idiomas?
Si has visitado las páginas de recursos que te he preparado, verás que Hackeando Idiomas es un recurso que te recomiendo continuamente.
¿Por qué lo recomiendo?
La respuesta es muy sencilla: para adaptarte al futuro que se nos echa encima, hipertecnológico e hiperconectado, es fundamental aprender lenguas extranjeras: ¡la mayoría de los recursos que encontrarás están en inglés! Olga Akimova, la persona detrás del proyecto de Hackeando Idiomas, ha creado una estrategia de siete días para que empieces a hablar un idioma. Si te suscribes a su página web, tendrás acceso a dicha estrategia, ¡y podrás comprobar por ti mismo lo eficaz que es!
¿Qué idioma puedo aprender?
Puedes aprender el idioma que quieras. Olga ha creado una estrategia para ayudarte en el aprendizaje de la lengua que te propongas, con consejos y una actitud de coaching muy motivadora que, seguro, te va a ayudar que dejes atrás ese "yo no sirvo para los idiomas".
Esta nueva aplicación publicada en Google Play supone facilitar a los usuarios con dispositivos Android el acceso a este reto de siete días. Ganas acceso inmediato a los 7 días, ¡y hoy mismo puedes empezar a aprender inglés, por ejemplo!
Hackeando Idiomas: nueva aplicación publicada en Google Play
Entremos en materia.
Esta aplicación me supuso un pequeño reto, ya que la idea era hacer que las lecciones a partir de la tercera estuviera disponibles solo para suscriptores (suscribirse es gratis). No obstante, ¿cómo podía saber la aplicación quién estaba suscrito, y quién no?
Comienzo a diseñar una librería
La idea era, en principio, sencilla: de entrada, la aplicación no puede saber quién está suscrito, y quién no. Así, era imprescindible solicitarle al usuario su dirección de e-mail; la aplicación conectaría con MailChimp, comprobaría si el usuario existe o no; si no existe, lo suscribe y, una vez que el usuario confirma su dirección de e-mail, la aplicación desbloquea las lecciones.
Comencé a desarrollar una librería que hiciera, precisamente, todo esto. Tú lo único que tendrías que hacer es solicitar una llave API en tu cuenta de MailChimp, ¡y todo listo! Una vez que el usuario confirmase su dirección de e-mail, lo único que tendría que hacer sería pulsar un botón que dijera E-mail confirmado, y ya está. Esta librería, además, sería compatible con la nueva Ley de Protección de Datos, ya que no solo exigiría aceptar la política de privacidad para que el usuario se suscribiera. Además, guardaría este dato en la lista de correo en MailChimp.
Para comprender qué es una llave API (interfaz de programación de aplicaciones, por sus siglas en inglés), imagínate que un servicio de online posee dos interfaces:
No obstante, empezaron a llegar los problemas.
¿Cómo de segura está una aplicación publicada en Google Play?
Esa fue la primera gran pregunta que me hice. ¿Qué seguridad tengo de que no vaya un hacker (y no precisamente de idiomas) a hacerse con el archivo apk de la aplicación, rajarlo, sacar la llave API de MailChimp, y borrar las listas de suscriptores? Comencé a profundizar en el tema, y llegué a la conclusión de que la cosa era complicada. Encontré artículos que hablaban del Sistema Android Keystore, como Using the Android Keystore system to store and retrieve sensitive information, pero llegué a la conclusión de que el Android Keystore es más para encriptar información que le pertenece al usuario (y a la que este accede mediante su propia contraseña), que para ocultar una llave API interna.
Por si acaso te lo preguntas: sí, es relativamente fácil hackear una aplicación de Android. Aunque de manera predeterminada se utiliza ProGuard tanto para ofuscar el código como para hacer el archivo apk más ligero, las cadenas de texto siguen siendo visibles.
Una herramienta que sí oculta cadenas de texto es DexGuard, la versión premium de ProGuard, pero tiene un precio prohibitivo.
Yo les pedí un presupuesto para esta misma aplicación (no tienen precios en su página web) y me solicitaron 750€ (IVA no incluido; en España ascendería a un total de 907,5 €) por una licencia anual para proteger 1 aplicación, hasta 1000 descargas.
Mil descargas son menos de lo que parece; con la Calculadora Mágica las conseguí en mucho menos de un año.
¿Cómo resolver este problema?
Contenido de las lecciones: ¿cómo mantener la estructura?
El siguiente problema al que me enfrenté era hacer que el contenido de cada lección tuviese la misma estructura tanto en la web, como en la aplicación. Quería que la experiencia fuese óptima con independencia del dispositivo del usuario y esto, unido a lo peligroso que es publicar una llave API en una aplicación publicada en Google Play, me hizo tomar una decisión.
¿Recuerdas mi primer reto de Java?
Con el fin de superar el examen OCP de Java 8, hace una temporada me propuse crear aplicaciones de escritorio utilizando el material que es necesario aprender para superar dicha certificación.
El primer reto se trató de un sencillo navegador, que utilizaba una interfaz construida con JavaFX. Resultó ser un reto sencillo, ya que lo único que precisé hacer fue implementar un WebView, cuyo funcionamiento era el 90% de todo lo que hacía mi navegador.
Y, con la aplicación de Hackeando Idiomas, me planteé lo siguiente: ¿por qué no utilizar también un WebView?
Implementar un WebView fue una buena idea, ya que me permitió mostrar el contenido de las lecciones con facilidad (se abre la misma página web que reciben los suscriptores). Para detectar que el usuario ha finalizado las lecciones, programé un listener que comparaba la altura del contenido y el valor en el eje Y del evento touch (que se genera cuando el usuario toca la pantalla).
¿Cómo bloquear el contenido solo para suscriptores?
Mi intención era dejar abiertas las dos primeras lecciones, pero bloquear las siguientes, a no ser que el usuario llevara a cabo una acción.
Al principio, dicha acción consistía en compartir el progreso, con una url a la web de Hackeando Idiomas o la propia aplicación en Google Play. El problema que surgía era que la lección se desbloqueaba cuando se abría la ventana para compartir; es decir, el usuario en realidad no necesitaba compartir nada, sino hacer el amago. Una vez que se abría la ventana para compartir, podía cerrarla y tenía acceso a todo el contenido.
La solución era forzar que el usuario se suscribiera, pero ¿cómo?
¿Cómo comprobar las suscripciones?
De entrada, estaba claro que la aplicación no podía saber que un usuario ya estaba suscrito. Necesita un input de parte de este. ¿Cómo podía comprobar que un usuario ya estaba suscrito, sin acceder a la lista de MailChimp con la llave API?
La solución estaba clara: utilizando una contraseña.
Una vez que el usuario se suscribe, recibe una contraseña que introduce en la aplicación; la aplicación comprueba que la contraseña es correcta y desbloquea el contenido.
Así, el usuario precisa realizar una acción obligatoria, no necesito introducir la llave API en el código de la aplicación publicada en Google Play, y todos contentos.
¿Qué librerías he utilizado?
Algunas de las librerías que he utilizado ya aparecen en otras de mis aplicaciones, pero algunas las he utilizado por primera vez. Además, mientras estaba diseñando mi propia librería (que, por ahora, está en stand by) he aprendido a utilizar una más: Retrofit.
Interfaz
Interfaz (Java)
Conexión a Internet
Base de datos
Conclusiones: ¿qué he aprendido?
He aprendido muchas cosas con esta nueva aplicación publicada en Google Play. Como has visto, he ampliado el número de bibliotecas que utilizo, pero eso no es todo. Ahora poseo un conocimiento básico sobre seguridad en apps que antes no tenía y que, estoy seguro, me será de gran utilidad en un futuro.
¿Y tú? ¿Te animas a aceptar el reto de 7 días? ¡Descárgate la aplicación y comienza hoy a aprender! Cuéntame cuál ha sido tu resultado en 7 días, o mejor ve a Hackeando Idiomas y cuéntaselo a Olga tú mismo.