Noticia Tutorial de Kotlin Multiplatform (KMP): Compartiendo capas de red y base de datos con iOS

Tutorial de Kotlin Multiplatform (KMP) Compartiendo capas de red y base de datos con iOS


Hoy en día, lanzar una aplicación que funcione de maravilla tanto en Android como en iOS suele ser un quebradero de cabeza para muchas empresas. La lucha eterna entre desarrollar dos apps nativas desde cero o usar frameworks que a veces dejan la interfaz un poco «tiesa» es real. Aquí es donde entra en juego Kotlin Multiplatform (KMP), una propuesta de JetBrains que no quiere reinventar la rueda, sino permitirnos escribir la lógica una sola vez y usarla en todas partes sin renunciar a la calidad nativa.

A diferencia de otras opciones del mercado, KMP no te obliga a meterte en un camino cerrado. Su magia reside en la flexibilidad total, permitiendo que los desarrolladores decidan qué partes del código conviene compartir y cuáles deben quedarse en el terreno específico de cada sistema operativo. Es, básicamente, la herramienta ideal para quienes buscan eficiencia sin sacrificar la experiencia de usuario final.

¿Qué es exactamente Kotlin Multiplatform y cómo funciona?​


En esencia, KMP es un kit de desarrollo que nos permite crear una lógica de negocio compartida en Kotlin. Esto incluye aspectos críticos como la gestión de llamadas a APIs, la sincronización de datos y los algoritmos de validación. En lugar de escribir el mismo código dos veces (uno en Kotlin y otro en Swift), lo hacemos una sola vez en un módulo común.

El proceso técnico es fascinante. En Android, el código se traduce a bytecode de Java para correr en la JVM. Sin embargo, iOS no tiene JVM, por lo que KMP utiliza Kotlin/Native. Este sistema usa LLVM para compilar el código Kotlin directamente en binarios nativos que Xcode entiende perfectamente, permitiendo que la lógica se integre como si fuera un framework más de iOS.

Esquema de funcionamiento KMP


Compartiendo la capa de red y la base de datos​


Cuando hablamos de compartir capas de red y datos, KMP brilla con luz propia. Para el networking, la librería estándar de facto es Ktor, que permite realizar peticiones HTTP de forma asíncrona y eficiente en todas las plataformas. A esto le sumamos kotlinx.serialization para manejar el JSON sin complicaciones, logrando que la comunicación con el servidor sea idéntica en cualquier dispositivo.

En cuanto a la persistencia, SQLDelight es la herramienta estrella. A diferencia de otras bases de datos, SQLDelight genera código Kotlin basado en sentencias SQL reales, lo que garantiza que la gestión de la base de datos sea robusta y tipada, evitando errores en tiempo de ejecución que podrían tirar la app en iOS mientras en Android funciona bien.

Arquitectura limpia y estructura de proyecto​


Para que un proyecto de este tipo no se convierta en un caos, es fundamental aplicar Clean Architecture. Lo ideal es organizar el proyecto en módulos: un núcleo común para el networking y la base de datos, y módulos específicos por funcionalidades (features). Cada funcionalidad suele dividirse en tres capas: la de dominio (casos de uso e interfaces), la de datos (implementaciones de repositorios) y la de presentación.

Para manejar las particularidades de cada sistema, KMP utiliza el mecanismo expect/actual. Por ejemplo, si necesitas acceder a un sensor específico del teléfono, declaras una función expect en el código común y escribes la implementación actual correspondiente tanto para Android como para iOS, manteniendo la coherencia en la firma del método.

La evolución hacia Compose Multiplatform​


Durante mucho tiempo, KMP solo servía para compartir la lógica, obligándonos a hacer la UI en SwiftUI para iOS y Jetpack Compose para Android. Pero ahora tenemos Compose Multiplatform. Este framework permite llevar la interfaz declarativa de Android a iOS, permitiendo que la UI se renderice mediante la biblioteca gráfica Skiko, logrando que la aplicación se vea y se sienta igual en ambas plataformas.

A pesar de que Compose para iOS ha avanzado mucho, es importante saber que todavía hay retos en cuanto a la física del desplazamiento y los gestos nativos. Por eso, KMP ofrece una interoperabilidad bidireccional: puedes incrustar vistas de UIKit dentro de Compose o meter pantallas de Compose dentro de una app de SwiftUI ya existente, facilitando una migración gradual.

Ventajas y desafíos reales en el día a día​


La principal ventaja es la reducción de costes y tiempo. Al no duplicar el trabajo de red y datos, los errores se corrigen una sola vez y se reflejan en todas las apps. Además, mejora la colaboración entre equipos, ya que los desarrolladores de Android e iOS pueden trabajar sobre la misma base lógica, evitando que una plataforma se quede atrás en funcionalidades.

No todo es color de rosa, ya que el ecosistema de librerías sigue madurando. A veces, integrar alguna funcionalidad muy específica de iOS puede requerir envoltorios en Swift para solucionar problemas de genéricos o parámetros predeterminados. Asimismo, los tiempos de compilación con Kotlin/Native pueden ser algo más lentos que los de un proyecto puramente nativo en Xcode.

La adopción de KMP es una apuesta inteligente para proyectos con lógica compleja que necesitan estabilidad y rendimiento. Al combinar Ktor, SQLDelight y una arquitectura modular, se logra un equilibrio perfecto entre la rapidez de desarrollo multiplataforma y la potencia de una ejecución nativa, asegurando que el producto final sea escalable y fácil de mantener a largo plazo.

Continúar leyendo...