Aplicaciones móviles nativas

Aplicaciones móviles nativas

Introducción

Onesait Platform cuenta con un proyecto de aplicación multiplataforma desarrollada mediante Kotlin Multiplatform, lo que permite contar con interfaces de usuario nativas para las plataformas de Android (con Jetpack Compose) e iOS (SwiftUI).

Requisitos

Para trabajar con el código compartido de Kotlin, se requiere:

Desarrollos en Android

Es necesario contar, dentro del IDE que se utilice, el emulador de Android (o utilizar un dispositivo físico).

Desarrollos en iOS

En el caso de iOS, se requiere:

  • Un ordenador con MacOS.

  • Como IDE, hay que utilizar Xcode.

  • En Xcode, se tiene que tener el emulador de iOS, o utilizar un dispositivo físico.

Estructura del proyecto

El proyecto se organiza en diferentes carpetas, cada una de las cuales presenta diferentes funcionalidades.

Shared

Este módulo contiene la lógica de negocio y de acceso a datos que se comparte entre las plataformas de iOS y Android.

Se separan las responsabilidades en tres capas principales:

  • Presentación.

  • Dominio.

  • Datos.

Presentation

El código aquí contenido es el que se ocupa de la lógica de la interzar de usuario (UI).

UI

Contiene los «ViewModel» de cada pantalla. Están conformados por:

  • UIState:que gestiona y expone el estado que la UI debe dibujar.

  • ViewModelActions: es una interface donde se definen las funciones que se tienen que procesar en cada ViewModel y la navegación (otra interface) con el contrato de navegación.

Navegation

Define los contratos de navegación a través de interfaces.

El ViewModel utiliza estas interfaces para solicitar un cambio de pantalla, pero la implementación real de la navegación se realiza en la capa nativa de cada plataforma.

Domain

Contiene las reglas de negocio, pero es independiente de la UI y la fuente de datos.

El fichero «DomainConfiguration» es donde se registra las implementaciones concretas de los casos de uso en sus interfaces a través del sistema de inyección de dependencias (Locator). Esto permite el desacoplamiento entre las capas.

El fichero «DataConstants» tiene las constantes globales que se utilizan en toda la aplicación con puede ser los endpoints al servidor.

Model

Se encontrarán las entidades de negocio limpios e independientes al servidor, con los que trabaja la aplicación.

Los ficheros que finalizan en UIState son los estados que utiliza la UI que se implementan en los ViewModel.

Repository

Se definen los contratos (interface) de los repositorios, normalmente contiene funciones «suspend» ya que serán llamadas a servidores u otros servicios pesados y tendrán que ejecutarse en segundo plano. Estas funciones dicen qué datos necesita, pero no le importa cómo o de dónde se obtienen.

UseCase

Cada caso de uso representa una única acción cumpliendo un objetivo específico obtenido de un repositorio.

Data

Representa la implementación concreta de la obtención (almacenamiento) de los datos.

El fichero «DataConfiguration» es donde se registra las implementaciones concretas de los repositorios para sus interfaces a través del sistema de inyección de dependencias (Locator).

Model

Contiene los DTOs, son los modelos que se obtienen del servidor. Esos modelos no deben de salir de esta capa y se deben de mapear en los modelos limpios de la capa de dominio.

Repository

Implementa las interfaces definidas en la capa de dominio. Se obtienen los datos correspondientes del servidor.

AndroidApp

Es el módulo de la aplicación en Android. Se define la UI nativa en Jetpack Compose y se conecta dicha UI con la lógica compartida definida en el módulo ‘shared’.

UI

Contiene los componentes visuales y la estructura de principal de la aplicación.

El fichero MainActivity.kt es el punto de entrada de la aplicación donde se configura el sistema de inyección de dependencias (Locator) registrando las implementaciones específicas de Android como la navegación y los servicios. También se define el punto de entrada de la UI, la primera pantalla que se va a mostrar al iniciar la aplicación.

Controls

Contiene los Composables de UI genéricos y reutilizables como los diálogos para mantener un diseño consistente y reducir la duplicación de código.

Features

Contiene cada pantalla de la aplicación. En cada una se obtiene su instancia de su ViewModel correspondiente del módulo de ‘shared’. Se observan los cambios de estado (UIState) expuestos por el ViewModel.

En cada UI utiliza se reutiliza un contendedor BaseScreen, que gestiona la lógica común a todas las pantallas, como mostrar diálogos o la carga.

Theme

Se define la apariencia visual global de la aplicación. Donde se encuentra Colors, con la paleta de colores de la aplicación, y Typography, con las fuentes personalizadas.

Navigation

Implementa los contratos de navegación definidos en la capa de Presentation del módulo de ‘shared’. Su responsabilidad es ejecutar las acciones específicas de Android.

Services

Contiene las implementaciones concretas de los servicios que son específicos de la plataforma Android.

IOSApp

Es el módulo que contiene el código especifico de la plataforma iOS. Su responsabilidad es construir la UI nativa y servir de puente entre la lógica compartida del módulo ‘shared’.

El fichero iOSApp.swift es el punto de entrada a la aplicación. Se encarga de inicializar y configurar la inyección de dependencias (‘Locator’) y es donde se debe de registrar las implementaciones nativas como los servicios y navegadores.

UI

Se encuentran los componentes de la aplicación.

Features

Contiene las pantallas completas y las envolturas (‘Wrapper’) de los ‘ViewModel’ correspondientes del ‘shared’ para poder actuar de puente y reaccionar a los cambios de estado en iOS.

Controls

Contiene las vistas de UI genéricos y reutilizables que se usan en múltiples pantallas como botones, campos de formulario, etc.

Theme

Define la apariencia visual de la aplicación como los colores, tipografía y estilo de botones, etc.

Navigation

Contiene las implementaciones concretas de los contratos de navegación definidos en el módulo shared.

Services

Contiene las implementaciones nativas de iOS para las interfaces de servicios. Como el caso del spinner de carga o la presentación de diálogos.