Última milla (APP)
Manual técnico
Última milla (APP)
Fecha: 13 de agosto de 2024
Versión: Ver. 1.0
Proyecto: GM-ULTMILLA
Elaborado por:
Certuit Software S. de R.L de C.V.
Cerro de las Campanas No. 384, Insurgentes Oeste, CP. 21280
Mexicali, BC. México
Historial de Cambios
| Fecha | Secciones | Razón de Cambios | Autor(es) | Revisor(es) |
|---|---|---|---|---|
| 13 de agosto de 2022 | TODAS | Creación del documento | Esteban Valencia | Adrian Renteria |
| 22 de agosto del 2024 | TODAS | Actualización de contenido y formato | Jocelyn Martinez | |
| 27 de agosto del 2024 | TODAS | Correcciones de redacción | Esteban Valencia | |
| 2 de septiembre del 2024 | Anexo | Actualización de formato | Jocelyn Martinez |
GM Última Milla App
1. Introducción
1.1 Descripción del Proyecto
GM Última Milla App es una aplicación diseñada para ser utilizada por operadores encargados de la recolección y entrega de mercancía. La mercancía se identifica mediante guías, y la aplicación permite a los operadores recibir un listado de registros correspondientes a estas guías. Los operadores pueden interactuar con estos registros para cambiar el estado de la entrega, indicando si la mercancía está en ruta, si la recolección/entrega se ha completado o si ha sido cancelada.
La aplicación soporta el manejo de recolecciones y guías pero para fines de simplificación se menciona en este manual únicamente la entrega de guías. Todos los flujos se aplican de manera equivalente tanto para guías como para recolecciones.
1.2 Tecnologías y Librerías Utilizadas
1.2.1 Kotlin
La aplicación está escrita totalmente en Kotlin.
1.2.2 Corrutinas
La aplicación utiliza corrutinas de Kotlin para manejar operaciones asíncronas de manera eficiente. Las corrutinas son una característica de Kotlin que permite escribir código asíncrono de manera secuencial, simplificando la gestión de tareas concurrentes y mejorando la legibilidad del código.
1.2.3 Retrofit
La aplicación utiliza Retrofit para la comunicación con el backend. Retrofit es una librería de tipo cliente HTTP para Android y Java, que facilita la interacción con APIs RESTful de manera eficiente y sencilla.
1.2.4 Room
Room es solamente utilizado para el uso del chat. Room es una librería de persistencia de datos que proporciona una abstracción sobre SQLite.
2. Arquitectura de la Aplicación
2.1 Arquitectura VIPER
La aplicación está estructurada utilizando la arquitectura VIPER (View, Interactor, Presenter, Entity, Router). VIPER es un patrón de diseño que separa claramente las responsabilidades de cada componente, facilitando la escalabilidad y el mantenimiento del código.
- View: Responsable de la interfaz de usuario y la presentación de datos.
- Interactor: Contiene la lógica de negocio y maneja las operaciones de datos.
- Presenter: Actúa como intermediario entre la View y el Interactor, gestionando la lógica de presentación.
- Entity: Modelos de datos utilizados por el Interactor.
- Router: Gestiona la navegación entre pantallas.
2.2 Navegación
Para la navegación dentro de la aplicación, se utilizan las siguientes herramientas:
- Cicerone: Una librería de navegación ligera para Android que facilita la gestión de la navegación entre pantallas.
- Dagger: Una librería que permite la inyección de dependencias.
- Navigation Components: Parte de Android Jetpack, proporciona una forma más estructurada y declarativa de gestionar la navegación dentro de la aplicación.
3. Configuración del Entorno de Desarrollo
Android Studio
El proyecto ha sido desarrollado utilizando Android Studio Giraffe | 2022.3.1 Patch 3.
Java Development Kit (JDK)
La versión de Java utilizada para el desarrollo del proyecto es JDK 17. Es necesario asegurarse de tener esta versión instalada y configurada en tu entorno de desarrollo.
3.1 Configuración Inicial del Proyecto
Seguir los pasos descritos para configurar el proyecto en un ambiente de desarrollo (local):
- Clonar repositorio:
git clone http://190.9.53.4:3000/GM-Transport/ultima-milla-app.git
- Asegurar versión de Java:
En Android Studio abrir Settings > Build, Execution, Deployment > Build Tools > Gradle. En la sección Gradle Projects, ver campo Gradle JDK. La versión que aparezca debe ser Java 17.
- Compilar proyecto:
En Android Studio ubicar en la parte superior el botón con icono de martillo Make Module. Presionar para compilar.
3.2 Conexión con servicios
Rutas de servicios
El proyecto se divide en tres ramas principales: master, develop, y calidad. Las ramas calidad y develop están conectadas al ambiente de pruebas, mientras que la rama master está conectada al ambiente de producción.
Las URLs de cada ambiente se encuentran en el archivo Constants. Ruta: app\main\java\com.certuit.gmultimamilla\data\constants\Constants.kt
- Ambiente de Pruebas:
- Ambiente de Producción:
Es importante mencionar que al configurar Retrofit para las peticiones http hacia el backend, se inserta de forma automática el header RFC en todas las peticiones. El RFC se obtendrá automáticamente al momento de iniciar sesión para identificar qué base de datos consultará la información. Ruta de la configuración del cliente Retrofit: app\main\java\com.certuit.gmultimamilla\data\remote\RetrofitMainClient.kt
3.3 Organización de Directorios
La estructura de directorios está organizada de la siguiente manera:
- com.certuit.gmultimamilla
- BaseApplication: Esta clase corresponde al Application de la app.
- Screens: Este objeto contiene los intents para dirigir a las diferentes activities de la app.
- dagger: Contiene la configuración necesaria de Cicerone en conjunto con Dagger para hacer posible la navegación entre activities.
- data: Contiene cuatro subdirectorios y un contrato genérico para las funciones siempre necesarias en cada clase de los módulos de vista:
- constants: Contiene las constantes de la app, incluyendo las URLs a backend.
- local: Contiene la configuración de las tecnologías de almacenamiento local, como Shared Preferences y Room.
- model: Contiene los modelos de datos usados para recibir las respuestas de endpoints y para mandar datos a los endpoints.
- remote: Contiene la configuración de Retrofit para consumir el backend.
- service: Contiene las siguientes clases:
- TrackingService: Utilizada para administrar la localización en segundo plano.
- PushNotificationService: Usada para gestionar las notificaciones push.
- ui: Contiene las activities y fragments de la app. Cada módulo de vista se compone de cuatro clases debido al uso de VIPER:
- Vista (Fragment o Activity): Responsable de la interfaz de usuario y la presentación de datos.
- Presenter: Actúa como intermediario entre la vista y el interactor, gestionando la lógica de presentación.
- Interactor: Contiene la lógica de negocio y maneja las operaciones de datos.
- Contract: Define las interfaces que conectan la vista, el presenter y el interactor.
- util: Contiene clases de utilidad y helpers que se usan en diferentes partes de la app.
4 Funcionalidades
4.1 Splashscreen
Descripción general
Esta vista inicia con la clase SplashScreenActivity. El flujo del splashscreen en la aplicación se encarga de verificar el estado de la sesión del operador y redirigirlo a la pantalla correspondiente.
Inicialización de la vista
A continuación se describen los pasos principales de este flujo:
- Inicio de la Aplicación
Al iniciar la aplicación, se muestra el splashscreen.
- Verificación de Sesión Activa
Durante la visualización del splashscreen, se verifica si el operador tiene una sesión activa.
- Sesión Activa: Si el operador tiene una sesión activa, se redirige a la pantalla de login.
- Sin Sesión Activa: Si el operador no tiene una sesión activa, se redirige a la pantalla del listado de guías.
4.2 Inicio de sesión
Descripción general
Este flujo se desarrolla iniciando en la clase LoginActivity. El flujo de inicio de sesión en la aplicación se encarga de autenticar al operador y redirigirlo a la pantalla correspondiente según su estado de autenticación.
Inicialización de la vista
Usando Firebase se obtiene el Device ID del dispositivo para las notificaciones push. Se inicializan los listeners de los componentes de la vista.
Acciones del usuario
Iniciar sesión
Los datos necesarios para el login son el número del operador y el RFC de la empresa. Al presionar el botón para iniciar sesión se realiza la siguiente petición al backend:
- URL:
- /api/Operador/ValidarLoginPaqueteria
- Body:
- Device ID
- Número del operador
- RFC de la empresa
De la respuesta del endpoint, se valida que el operador esté activo.
- Si el operador está activo, se guardan localmente los datos de inicio de sesión y se redirige a la pantalla del listado de guías.
- Si el operador no está activo, se muestra un mensaje en pantalla indicando que el operador no está autorizado. En este caso, se debe solicitar la activación del operador desde el sistema web.
Después de un inicio de sesión exitoso, el operador es redirigido a MainActivity, que aloja el contenedor de fragmentos para mostrar las pantallas más utilizadas en la app.
Actividad principal
Al iniciar la clase MainActivity, se realizan los siguiente procesos:
- Se inicializan los Navigation Components para gestionar la navegación entre fragmentos.
- Se crea como primera instancia el fragmento DeliveryFragment, definido como fragmento inicial en el archivo nav_graph.xml. DeliveryFragment administra el listado de guías y lo muestra al operador.
- Se verifica si la aplicación fue abierta desde una notificación push.
- Si es así, se redirige a la pantalla de Tracking (el uso de esta pantalla se detalla en punto 4.5).
- Se verifican los permisos de uso de ubicación en segundo plano. Considerar que estos permisos son obligatorios y la aplicación no funciona si no son otorgados.
- La ubicación en segundo plano solo será sincronizada cuando haya una entrega en curso.
- Se inicia la observación de las coordenadas del operador para rastrear su ubicación. Para mandar las coordenadas del operador se usa el siguiente endpoint:
- URL:
- “/api/ultima-milla/agregar-coordenadas-operador”.
- Body:
- Latitud.
- Longitud.
- Id de la ruta actual (el id de la ruta es obtenido hasta que se hace la primera petición por el listado de guías, que será más adelante).
4.3 Listado de Guías
Descripción general
Este flujo inicia con la clase DeliveryFragment. El flujo del listado de guías en la aplicación se encarga de mostrar al operador las guías con estatus de última milla pendiente y permitir la actualización de su estado.
Inicialización de la vista
Al crearse la instancia de DeliveryFragment, se realiza una petición para obtener la ruta del operador al endpoint:
- URL:
- /api/ultima-milla/consultar-ruta-por-operador-fecha/{idOperador}/{date}
- Variables:
- Id del operador.
- Fecha actual.
Este endpoint devuelve la información de la ruta asignada al operador, incluyendo el listado de guías. Se guarda el Id de la ruta. Se filtran las guías pendientes. Se calcula el porcentaje completado de la ruta. Si hay guías con estatus pendiente o en camino, se rastrea al operador. Si no hay ruta asignada al operador se muestra pantalla de vacío.
Acciones del usuario
Una vez que el listado de guías se muestra en pantalla es posible interactuar con ellas. En cada tarjeta se puede ver la siguiente información:
- Folio de la guía
- Dirección de la entrega
- Placas de la unidad
- Indicador de si es una recolección o una entrega, y del lado izquierdo en caso de tener una cita con hora máxima de entrega se mostrará la hora.
Descargar CFDI de traslado
Cuando las guías están timbradas aparecerá en la esquina superior derecha un icono redondo con un papel, este obtendrá el CFDI de traslado correspondiente a esa mercancía. El archivo se obtiene haciendo una petición al endpoint:
- URL:
- “/api/GenerarReporte/CFDIGuia/{idGuia}” en caso de consultar el de una guía.
- “/api/GenerarReporte/CFDIRecoleccion/{idRecoleccion}” en caso de consultar el de una recolección.
- Variables:
- IdGuia o IdRecolección.
Consideraciones
Antes de hacer la petición para obtener el archivo se validan los permisos para acceder al almacenamiento del dispositivo, si los permisos no son aceptados no se podrá ver el archivo.
Ver detalles de la entrega
El listado de registros está configurado para permitir seleccionar solo un registro, el primero de la lista, esto para asegurar que las entregas se hagan en el orden correcto.
En caso de querer un orden diferente, el operador deberá comunicarse con la sucursal para que hagan el reordenamiento de guías desde el sistema web. Al seleccionar una guía se redirigirá a la pantalla de detalles de la entrega, donde se podrá ver el punto exacto de la entrega y dar inicio a la ruta, el flujo se explicará a continuación (punto 4.4).
4.4 Iniciar Entrega
Descripción General
Este flujo inicia con la clase DeliveryDetailsFragment. Al seleccionar una guía, se redirige a la pantalla de detalles de entrega donde el operador puede ver el punto exacto al que debe ir y dar inicio a la entrega.
Inicialización de la Vista
Al inicializar esta vista, lo primero que pasa internamente es cargar el mapa, el cual es impulsado por Google Maps a través de su API. El usuario podrá ver en pantalla el mapa con un marcador en el punto de entrega.
Acciones del usuario
Dar Inicio a la Entrega
En la parte inferior habrá un botón para dar inicio a la entrega. En caso de que se acceda a esta vista cuando hay una entrega en curso, el botón estará deshabilitado. Al presionar el botón, se hará una petición al endpoint:
- URL:
- /api/ultima-milla/actualizar-estatus-guia/{nEstatus}/{nIdParada}
- Variables:
- Id del estatus “En camino”. Los estatus de última milla se encuentran en la clase Constants.
- Id histórico de la guía en última milla (no es el mismo que el id fijo de la guía).
- Body:
- Se manda el mismo objeto guía, aunque para el caso de actualizar a “En camino” no se usa ningún valor del body.
Cuando la petición se hace con éxito, se inicia el rastreo del operador y se redirige a la pantalla de Tracking para dar inicio al flujo Tracking.
4.5 Tracking
Descripción general
Este flujo inicia con la clase TrackingFragment. Al iniciar una entrega se redirige al usuario a la pantalla de Tracking.
Inicialización de la vista
Al inicializar esta vista,se carga el mapa, el cual es impulsado por Google Maps a través de su API. El usuario podrá ver en pantalla el mapa con un marcador en el punto de entrega.
Finalmente se hace una petición al siguiente endpoint:
- URL:
- /api/ultima-milla/consultar-ruta-por-operador-fecha/{idOperador}/{date}
- Variables:
- Id del operador.
- Fecha actual.
Al tener el listado de guías se filtran para obtener la guía que tiene estatus En camino.
Al tener la información de la guía, se realiza lo siguiente:
- Se coloca un marcador en el mapa indicando el punto de entrega.
- Se calcula la ruta más óptima para llegar al destino (por medio de la librería Google-Directions-Android) y se habilitan los botones ocultados previamente, además de un botón extra con icono de caja, este botón permite iniciar el flujo de finalizar entrega (punto 4.5).
Acciones del usuario
Esta vista tiene diferentes botones, todos son ocultados al arrancar, los botones permiten hacer las siguientes acciones:
Abrir chat con la sucursal
Se detalla en la sección Chat (punto 4.8)
Abrir aplicación nativa de llamadas.
Se redirigirá a la aplicación de llamadas por defecto del dispositivo.
Consultar CFDI de traslado
Al igual que en la vista del listado de guías pendientes, en la vista de tracking también se puede consultar el CFDI de traslado de la guía haciendo click en el botón superior derecho de la tarjeta con la información de la guía. El botón estará disponible siempre y cuando la guía haya sido timbrada desde el sistema web.
Iniciar Flujo Finalizar entrega
La aplicación cuenta con lógica para ir actualizando la ruta hacia el destino conforme el operador va avanzando. Cuando se detecta que el operador se encuentra cerca del punto de entrega, se muestra en pantalla un botón en la parte inferior para iniciar con el flujo de finalizar entrega.
También se puede iniciar el flujo haciendo click en el botón con icono de caja ubicado en el lado derecho de la pantalla, que fue habilitado al obtener la información de la guía al iniciar la vista.
4.6 Finalizar Entrega
Descripción general
Este flujo inicia en la clase FinishDeliveryFragment. Al momento que un operador llega a su destino a recoger o entregar mercancía es necesario almacenar información de la persona que recibe o da al operador la mercancía.
Inicialización de la vista
Al crear la vista para finalizar la entrega se obtienen los datos de la guía para mostrar al operador, con el fin de verificar la entrega de la mercancía correcta.
Acciones del usuario
Hay únicamente dos cosas que el operador debe asegurar para poder completar una entrega: tener el nombre de la persona que recibe la mercancía, tener la firma de la persona que recibe la mercancía.
Escribir nombre de receptor
Es un campo de texto simple en el que se escribirá el nombre del receptor.
Dibujar Firma
La firma se hace mediante un “dibujo” que la persona debe hacer en la aplicación.
Para esto se usa la librería Android Signature Pad implementada en la clase SignatureActivity. Esta librería nos dará lo dibujado como una imagen, la cual será mandada al servidor al momento de finalizar la entrega.
La imagen será identificada como firma al asignarle el tipo de archivo 2. Los tipos de archivos se encuentran en la clase Constants.
Adjuntar evidencias
Opcionalmente el operador puede adjuntar imágenes que sirvan como evidencia para demostrar la entrega de la mercancía. Las imágenes pueden ser fotos de la galería o tomadas en tiempo real con la opción de cámara.
Las imágenes serán identificadas como evidencias de completado al asignarle el tipo de archivo 1. Los tipos de archivos se encuentran en la clase Constants.
Cancelar la entrega
En caso de alguna situación las entregas pueden ser canceladas. Para iniciar el flujo de cancelación no es necesario poner un nombre de receptor ni dibujar una firma. El flujo será explicado a detalle más adelante (punto 4.7).
Dar fin a la entrega
Una vez se ha llenado la información necesaria se puede dar fin a la entrega presionando el botón en la parte inferior de la pantalla.
Para completar la entrega se hará una petición a los siguientes endpoints:
Actualizar estatus de la guía
- URL:
- /api/ultima-milla/actualizar-estatus-guia/{nEstatus}/{nIdParada}
- Variables:
- Id del estatus “Completada”. Los estatus de última milla se encuentran en la clase Constants.
- Id histórico de la guía en última milla (no es el mismo que el id fijo de la guía)
- body:
- Receptor.
Mandar imagenes
- URL:
- /api/UltimaMilla/Guia/SubirImagen
- Headers:
- IdGuia
- ImagenNombreArchivo. Aunque en base de datos se guarda con un nombre diferente es importante que el nombre de cada imagen sea único para que backend no las tome como la misma imagen en caso de ser más de una.
- Descripción
- EsRecoleccion. Es importante indicar si es de una recolección o guía porque una recolección y una guía pueden tener el mismo ID.
- Content-Type. Para que lo acepte el estado actual del backend debe ser “application/octet-stream”.
- TipoArchivo. Indica si es evidencia de completado o firma. Este fue asignado al momento de obtener la imagen.
- Body:
- RequestBody con el arreglo de bytes de la imagen.
Al obtener respuesta exitosa de los endpoints se redirigirá a la pantalla de confirmación en la clase DeliveryFinishConfirmationFragment. Esta clase mostrará la pantalla de confirmación mientras obtiene el listado actualizado de las guías y valida el estatus de cada una.
- Si existe una más con estatus pendiente, redirigirá a la pantalla de detalles de entrega para dar inicio al flujo de iniciar entrega.
- Si no hay entregas pendientes se redirigirá al listado de guías y se acabará el rastreo del operador.
Cuando la última entrega de una ruta es completada, la ruta entera se marca como completada. Esto evita que las entregas de la ruta recién completada puedan ser consultadas en el historial.
4.7 Cancelar Entrega
Descripción general
Este flujo inicia en la clase CancelDeliveryContract. Este flujo es necesario para el escenario en el que la mercancía no puede ser entregada.
Inicialización de la vista
Al arrancar la vista se inicializan los listeners de los botones y se recibe la información de la guía.
Acciones del usuario
Escribir motivo de cancelación
Se hace por medio de un campo de texto sencillo. Lo escrito se va guardando en los datos de la guía que serán enviados al cancelar la entrega.
Adjuntar evidencias
Opcionalmente el operador puede adjuntar imágenes de galería o tomarlas directamente con la cámara.
Las imágenes serán identificadas como evidencias de cancelación al asignarles el tipo de archivo 3. Los tipos de archivos se encuentran en la clase Constants.
Dar fin a la cancelación de entrega
Al presionar el botón Enviar ubicado en la parte inferior de la pantalla se iniciará el proceso de cancelación de la entrega. Esto permitirá que la guía pueda volver a ser asignada a una nueva ruta desde el sistema web.
Para completar la entrega se hará una petición a los siguientes endpoints:
Actualizar estatus de la guía
- URL:
- /api/ultima-milla/actualizar-estatus-guia/{nEstatus}/{nIdParada}
- Variables:
- Id del estatus “Cancelada”. Los estatus de última milla se encuentran en la clase Constants.
- Id histórico de la guía en última milla (no es el mismo que el id fijo de la guía)
- body:
- Motivo.
Mandar imagenes
- URL:
- /api/UltimaMilla/Guia/SubirImagen
- Headers:
- IdGuia
- ImagenNombreArchivo.
- Es importante que el nombre de cada imagen sea único.
- Descripción
- EsRecoleccion.
- Es importante indicar si es de una recolección o guía porque una recolección y una guía pueden tener el mismo ID.
- Content-Type.
- Para que lo acepte el estado actual del backend debe ser “application/octet-stream”.
- TipoArchivo.
- Indica si es evidencia de completado o firma. Este fue asignado al momento de obtener la imagen.
- Body:
- RequestBody con el arreglo de bytes de la imagen.
Al obtener respuesta exitosa de los endpoints se redirigirá a la pantalla de confirmación en la clase CancelDeliveryConfirmationFragment. Esta clase mostrará la pantalla de confirmación mientras obtiene el listado actualizado de las guías y valida el estatus de cada una.
- Si existe una más con estatus pendiente, redirigirá a la pantalla de detalles de entrega para dar inicio al flujo de iniciar entrega.
- Si no hay entregas pendientes se redirigirá al listado de guías y se acabará el rastreo del operador.
4.8 Chat
Descripción general
Este módulo se desarrolla iniciando con la clase ChatFragment. El módulo de chat es una herramienta para poder comunicarse con la sucursal sin salir de la aplicación. Los mensajes serán recibidos por la sucursal en tiempo real y recibidos por la aplicación del mismo modo.
Inicialización de la vista
Al arrancar esta vista se hace una petición al backend para obtener los mensajes del operador con la sucursal usando el siguiente endpoint:
- URL:
- /api/UltimaMilla/Chat/Operador
- Parámetros:
- Id del operador
- Fecha actual
Una vez obtenidos los mensajes se usa Room para almacenarlos localmente y poder acceder a ellos en caso de que el dispositivo no tenga internet.
Acciones del usuario
Mandar mensajes
La funcionalidad se limita a texto. Solo es necesario escribir el contenido en el campo ubicado en la parte inferior de la pantalla y presionar el botón de la derecha para enviarlo. Al mandar el mensaje se hace usando el siguiente endpoint:
- URL:
- /api/UltimaMilla/Chat
- Body:
- Mensaje.
- Id del operador.
- Fecha actual
4.9 Historial
Descripción general
Esté módulo se desarrolla iniciando en la clase HistoryFragment. El módulo Historial tiene el propósito de permitir al operador verificar entregas pasadas de la ruta mientras la ruta siga activa, es decir, que no se hayan completado todas las entregas de la ruta.
Inicialización de la vista
Al arrancar la vista se hace una llamada al siguiente endpoint:
- Obtener ruta
- URL:
- /api/ultima-milla/consultar-ruta-por-operador-fecha/{idOperador}/{date}
- Variables:
- Id del operador.
- Fecha actual.
- URL:
Al obtener la ruta se extraen las rutas y se filtran las que tienen estatus completadas o canceladas para mostrarlas listadas.
Acciones del usuario
Consultar detalles de guía
Al presionar un registro del listado se redirigirá a la pantalla de detalles dada por la clase HistoryDetailsFragment. Se abordará con más detalle a continuación (punto 4.10).
4.10 Detalles de historial
Descripción general
Está vista se desarrolla iniciando en la clase HistoryDetailsFragment. La vista detalles de historial funciona para ver los detalles de una guía completada o cancelada a la que se presionó desde el listado del módulo Historial.
Inicialización de la vista
Al arrancar la vista obtiene la información de la guía a partir de los argumentos pasados a la clase a través de NavArgs.
4.11 Perfil
Descripción general
Esta vista se desarrolla inicialmente en la clase ProfileFragment y se accede por medio de la barra de navegación inferior de la app.
Inicialización de la vista
Al arrancar la vista se obtiene de SharedPreferences la información del usuario que fue guardada cuando inició sesión.
Acciones del usuario
Cerrar sesión
Para cerrar sesión sólo es necesario presionar el botón ubicado en la parte inferior de la vista. Al cerrar sesión se realiza el siguiente proceso:
- Se detiene el rastreo del operador.
- Se borran los datos de sesión y se restaura el estado de las variables que indiquen una sesión abierta.
- Se hace la siguiente llamada al backend para borrar el device id al operador:
- URL:
- /api/Operador/LogoutPaqueteria
- Body:
- IdOperador
Anexos
1. Operación
La app aún no se encuentra en Play Store, sin embargo se explicarán los pasos a seguir para realizar los despliegues cuando sean necesarios.
1.1 Entorno de desarrollo
Para compilar la aplicación en Android Studio es necesario asegurar la Versión de Java, esto puede validarse con los siguientes pasos:
- Abrir Settings > Build, Execution, Deployment > Build Tools > Gradle.
- En la sección Gradle Projects, ver campo Gradle JDK.
- La versión que aparezca debe ser Java 17.
1.1.2 Subir versión a Google Play Store.
Para subir una nueva versión de la aplicación a la tienda es necesario aumentar el número de la versión desde Android Studio. Los pasos son los siguientes:
- Abrir el archivo build.gradle (Module: app)
- Ir a la sección android y luego a defaultConfig.
- Modificar los valores de versionCode y versionName.
Nota. También se recomienda aumentar el número de la versión del código. -también-se-recomienda-aumentar-el-número-de-la-versión-del-código.}
1.2 Generación de empaquetado (APK/Bundle)
Para la creación de empaquetado es necesario configurar el ambiente de desarrollo descrito en la sección 1.1 del Anexo.
1.2.1 Generar APK
- Ir a Build > Build Bundle(s) / APK(s) > Build APK(s).
- Esperar a que se complete el proceso y encontrar el APK en el directorio app/build/outputs/apk.
1.2.2 Generar App Bundle
- Ir a Build > Generate Signed App Bundle. (solicitar el keystore y credenciales)
- Esperar a que se complete el proceso y encontrar el archivo .aab en el directorio app/build/outputs/bundle.
1.3 Subir versión a Google Play Store.
Se describen los pasos a seguir para subir el empaquetado y enviar a revisión la aplicación.
- Acceder a Google Play Console.
- Para esto es necesario iniciar sesión en Google Play Console.
- Dentro del panel de control seleccionar la aplicación.
- Ir a la sección Producción > Crear nueva versión.
- Dentro del formulario de creación debe:
- Subir el archivo .apk o .abb generado como se mencionó en la sección 1.2
- Agregar notas de la versión.
- Una vez completada la información, seleccionar Siguiente.
- Se muestra la previsualización, hacer clic en Revisar y luego en Iniciar lanzamiento a producción.
- Esto detonará el proceso de revisión de Google, el cual varía según la temporada o si es la primera vez que se manda una revisión.
- Una vez aprobada la aplicación la nueva versión estará disponible en la Play Store.
2. Actualización de ApiKey para uso de Google Maps SDK
**Esto se debe hacer en la aplicación de Paquetería y Última Milla.
Pasos para generar una API key para usar el SDK de Google Maps:
- Acceder a la Consola de Google Cloud:
- Abrir Google Cloud Console.
- Crear un nuevo proyecto:
- Si ya hay un proyecto, puede usarse. Si no, crear uno nuevo haciendo clic en “Select a project” y luego en “New Project”.
- Habilitar la facturación:
- Asegurarse de que el proyecto tenga una cuenta de facturación habilitada.
- Habilitar las APIs necesarias:
- Ir al menú de navegación y seleccionar “API & Services” > “Library”.
- Buscar “Maps SDK for Android” y hacer clic en “Enable”.
- Crear las credenciales:
- Ir a “API & Services” > “Credentials”.
- Hacer clic en “Create credentials” y seleccionar “API key”.
- Se generará una nueva API key. Copiar.
- Restringir la API key:
- Es recomendable restringir la API key para mayor seguridad.
- En la sección “Application restrictions”, seleccionar “Android apps”.
- Añadir el nombre del paquete de la aplicación y la huella digital SHA-1 del certificado de firma.
- Configurar la API key en el proyecto Android:
- Abrir el proyecto en Android Studio.
- Ve al archivo strings.xml en la carpeta res/values.
- Reemplaza el valor de api_key_directions con la API key nueva.
- Verifica la configuración:
- Asegúrate de que el archivo AndroidManifest.xml tenga los permisos necesarios y la meta-data para Google Maps.
- Ejecuta la aplicación:
- Ejecuta la aplicación y verifica que el mapa se muestra correctamente.
3. Actualizar proyecto de Firebase
**Esto se debe hacer en la aplicación de Paquetería y Última Milla.
Pasos para cambiar el proyecto de Firebase:
- Crear el nuevo proyecto en Firebase:
- Ir a Firebase Console y crear un nuevo proyecto.
- Configurar el nuevo proyecto:
- Añadir tu aplicación Android al nuevo proyecto. Necesitar el nombre del paquete y la huella digital SHA-1 del certificado de firma.
- Descargar el archivo de configuración:
- Descargar el archivo google-services.json del nuevo proyecto y reemplazar el archivo existente en tu proyecto Android.
- Actualizar las dependencias:
- Asegurarse de que las dependencias de Firebase en tu archivo build.gradle estén actualizadas.
- Actualizar la configuración en tu código:
- Verificar que todas las configuraciones y referencias a Firebase en tu código apunten al nuevo proyecto.
- Probar la aplicación:
- Probar la aplicación exhaustivamente para asegurarse de que todo funcione correctamente con el nuevo proyecto de Firebase.
- Publicar la actualización:
- Publicar la actualización en la tienda una vez que hayas verificado que todo funciona correctamente.