Desarrollar aplicación para Android y para iOS que consume un servicio APIRest y accede a las facturas de una base de datos externa (en cualquier motor de base de datos). Desarrollamos la app iOS y Android con Delphi 12, de RAD Studio, en Firemonkey. La misma aplicación también se puede ejecutar en entornos Windows.

Requisitos para desarrollar aplicación para iOS y Android con Delphi 12

Necesitaremos disponer el IDE Delphi 12, cuya versión gratuita Delphi 12 Community Edicion podremos descargar e inistalar como indicamos en este tutorial:

Para el acceso a la base de datos externa, usaremos el servicio APIRest, por lo que deberemos disponer de este servicio desarrollado en la parte del servidor de base de datos o en la parte del servidor web que acceda a esta base de datos. En el siguiente tutorial explicamos, paso a paso y con un ejemplo completo, cómo desarrollar un APIRest en PHP:

Para este tutorial, el servicio API RESTful o APIRest reside en la URL base:

http://proyectoa.com:8080/apirestfacturas

Y el URI que usaremos para que nos devuelva un listado de facturas en JSON será:

listar.php

Con lo que la URL completa para consumir este servicio APIRest será:

http://proyectoa.com:8080/apirestfacturas/listar.php

Este servicio devuelve el siguiente JSON con el listado de facturas que haya en la tabla correspondiente del motor de base de daos al que ataca el APIRest, con estos datos de ejemplo:

Lo importante del JSON es conocer su estructura, que en este caso está compuesto por un registro (una factura) entre llaves, que contiene, a su vez, los campos:

  • codigo (número): código de la factura.
  • cliente (texto): nombre del cliente de la factura.
  • importe (número): importe de la factura.
  • fecha (fecha): fecha de la factura.

Seguridad de acceso al servicio APIRest desde la aplicación Android/iOS con Delphi 12

No es objeto de este tutorial establecer un nivel de seguridad de acceso alto. Esto lo afrontaremos en otros tutoriales. Aunque sí conviene resaltar que en este caso, la seguridad es muy baja, dado que usaremos una conexión HTTP (texto plano sin cifrar) y, además, el acceso al APIRest no incluye mecanismos de autorización (como tokens u otros).

Lo recomendable es usar siempre protocolo HTTPS (SSL) para que el tráfico entre el dispositivo Android o iOS vaya cifrado hacia y desde el servidor que proporciona el servicio APIRest.

Por otro lado, también es muy recomendable e imprescindible, usar mecanismos de seguridad para validar el usuario, evitando que cualquier usuario de Internet pueda acceder al APIRest. Para ello se deben usar, además del mecanismo habitual de usuario y contraseña, tokens temporales (con expiración), que se generen en cada conexión y otros mecanismos para aumentar el nivel de seguridad.

Desarrollar aplicación multidispositivo para iOS y Android con acceso a base de datos externa en Delphi 12

Crearemos un nuevo proyecto en Delphi 12, desde «File» – «New» – «Multi-Device Application – Delphi»:

En la plantilla, elegiremos «Tabbed with Navigation», para crear una app base con pestañas y navegación entre ellas:

Guardaremos el proyecto en una carpeta del equipo:

Agregar componentes visuales a la app Android/iOS

Además de los componentes que Delphi ha añadido para mostrar una visualización tipo pestañas, añadiremos, a la pestaña inicial, el componente TGrid, de la paleta «Grids»:

Cambiaremos su propiedad propiedad «Name» a gridFacturas:

Hemos modificado las propiedades Text y Name del resto de componentes, para identificar cada uno con su uso.

Para este primer tutorial, mostraremos un listado de las facturas en un TGrid (gridFacturas) de la primera pestaña del TabControl principal (tabPrincipal) y un detalle de la factura seleccionada en el grid. Además, a modo de depuración, mostraremos el JSON original recibido del APIRest. Para ello, añadiremos un tercer tab al tabFacturas, seleccionando el tabFacturas (dentro del tabPrincipal) [1] y, dentro de este, seleccionando el tabFacturasGestion (dentro del tabFacturas) [2]. Pulsaremos con el botón derecho sobre el tabFacturasGestion y elegiremos «Add TabItem» [3]:

En la parte inferior del tabFacturasGestion nos aparecerán tres puntos, pulsando cada uno de ellos accederemos al tab correspondiente. Estos puntos sólo se muestran en tiempo de desarrollo, de diseño, para facilitar el movimiento entre tabs. Estos puntos no aparecen en tiempo de ejecución.

Nos posicionaremos en el último tab creado dentro del tabFacturasGestion y lo llamaremos «tabFacturasGestionDepuracion», añadiéndole un componente de tipo TMemo, de la paleta «Standard»:

Lo llamaremos txtJSONFacturas, con su propiedad «Align» a valor «Client», para que se adapte a la pantalla:

Al componte TGrid (gridFacturas), le agregaremos los campos (columnas) que queramos mostrar. Esto no es obligatorio, si no añadimos los campos manualmente, al conectar con el TClientDataset (como explicaremos más adelante), se crearán los campos que se pasen desde este componente automáticamente. Pero esto no es recomendable, dado que los campos no quedarán formateados en tamaño y posición.

Para añadir los campos manualmente al TGrid, sobre él, pulsaremos con el botón derecho. En el menú emergente elegiremos «Items Editor…»:

Añadiremos una columna de tipo TIntegerColumn para el campo «codigo» del JSON:

En las propiedades de esta columna podremos establecer su ancho (Width), el título que se mostrará al usuario (Header), el nombre para hacer referencia a ella en el código (si fuera necesario) Name y cualquier otra personalización que se quiera establecer:

Repetiremos el proceso para añadir las columnas:

  • Cliente: de tipo TStringColumn.
  • Importe: de tipo TCurrencyColumn.
  • Fecha: de tipo TDateColumn.

De forma que el TGrid quedará con las cuatro columnas que queremos mostrar al usuario:

Quedando una estructura visual similar a la siguiente:

A modo de ejemplo, añadimos también varios componentes más para mostrar otras formas de visualizar la información, como por ejemplo un ListView y un ListBox. Añadiremos también varios botones al Toolbar del TabFacturasGestionListado para movernos a los tabs que contienen estos componentes:

Para el tab de detalle, añadiremos los TEdit correspondientes para mostrar la información de cada factura y los botones para movernos en las facturas (primera, última, anterior, siguiente):

Añadimos un ListView :

Y un ListBox:

En ambos componentes (ListBox y ListView) mostraremos todas las facturas y haremos interactivos los elementos, de forma que al pulsar sobre ellos nos muestre un mensaje con los datos del elemento pulsado.

Agregar componentes de acceso a datos para consumo de APIRest y código Pascal necesario

Agregaremos ahora los componentes de acceso a datos. Empezaremos por el TClientDataSet, de la paleta «Data Access». Este componente será el que «separe» los datos en JSON en columnas y registros:

Que llamaremos cdFacturas:

Añadiremos un componente TRESTResponse, de la paleta «REST Client»:

Que llamaremos restRespuesta:

Añadiremos un componente TRESTResponseDataSetAdapter, de la paleta «REST Client»:

Este componente, que hemos llamado restRespuestaDataset, será el que «enlace» el componente TRestResponse (restRespuesta), mediante su propiedad «ResponseJSON», con el componente TClientDataSet (cdFacturas), mediante la propiedad «Dataset»:

Añadiremos un componente TRESTClient, de la paleta «REST Client»:

Lo llamaremos restCliente y tendrá la propiedad BaseURL que será en la que le indiquemos la URL del servicio APIRest que queremos consumir (la estableceremos por código):

Añadiremos, por último, un componente TRESTRequest, de la paleta «REST Client»:

Que llamaremos restPeticion. Este componente se enlazará con el componente TRESTClient (restCliente) mediante su propiedad «Client» y el componente TRESTResponse (restRespuesta) mediante la propiedad Response:

A modo de depuración, añadiremos un componente visual más, un TLabel, en el tabFacturasGestionListado, para mostrar información de depuración (tiempo empleado en realizar la consulta al APIRest, número de registros devuelto, etc.):

Código fuente de cada evento y componente en Delphi/Pascal

En el siguiente enlace dejamos disponible el código fuente completo de la app multidispositivo (Windows, Android, iOS) de ejemplo de acceso APIRest a base de datos:

En el código de la unidad de nuestra aplicación, añadiremos las siguientes unidades al uses de la unidad UnidadGestionFacturas:

Es recomendable respetar el orden anterior de los uses, que hemos agrupado por tipo, para que quede más claro el uso de cada uno de ellos.

En el evento OnCreate del formulario principal de la app, añadiremos el siguiente código Delphi/Pascal:

En el evento OnAfterExecute de restPeticion añadiremos el siguiente código Delphi/Pascal:

En el evento OnHTTPProtocolError del restPeticion añadiremos el siguiente código Delphi/Pascal:

En el evento OnAfterScroll del cdFacturas añadiremos el siguiente código Delphi/Pascal:

En el evento OnCellDblClick del gridFacturas añadiremos el siguiente código Delphi/Pascal:

Añadiremos los siguientes actions en el ActionList (que asignaremos a cada botón de acción):

Para la acción de mostrar el tab inicial con el listado de facturas en el TGrid:

Para la acción de mostrar el tab de detalle de la factura actual (seleccionada en el TGrid):

Para la acción de mostrar el tab de depuración con un TMemo con el JSON obtenido:

Para la acción de mostrar el tab con el listado de facturas en el ListBox formateado e interactivo (muestra una imagen que se puede habilitar o deshabilitar pulsándola, una imagen por cada factura, los datos de la factura y un botón de acción para cada factura):

Para los eventos definidos en el ListBox (BotonListPulsado y CheckListBoxPulsado) añadiremos el siguiente código Delphi/Pascal:

Para la acción de mostrar el tab con el listado de facturas en el ListView interactivo, al pulsar sobre una factura nos mostrará un mensaje con sus datos:

Para los botones de navegación de facturas (en el tab de detalle), en sus respectivos eventos OnClick, añadiremos el siguiente código Delphi/Pascal:

En el siguiente enlace incluimos el código fuente completo de la app multidispositivo con Delphi y Firemonkey:

Generación de APK, instalación en Android y funcionamiento de app con acceso a MySQL mediante APIRest

Si compilamos la aplicación multidispositivo elgiendo «Android 64-bit», para generar el APK para Android (en este enlace dejamos disponible el código fuente completo y el fichero APK de instalación en Android):

Se iniciará la compilación y generación del APK de instalación de la app en dispositivos smartphones Android:

Se habrá generado el apk, que enviaremos al móvil, por ejemplo por Telegram:

Descargaremos el apk en el móvil:

Generación de APK, instalación en Android y funcionamiento de app con acceso a MySQL mediante APIRest

Pulsaremos en «Instalar»:

Pulsaremos en «Instalar sin analizar»:

Pulsaremos en «Abrir» una vez instalada:

Generación de APK, instalación en Android y funcionamiento de app con acceso a MySQL mediante APIRest

La app se iniciará y mostrará en el grid las facturas con sus datos. Si hacemos doble pulsación en una de las facturas:

Nos mostrará su detalle. Desde este tab podremos movernos a la factura siguiente, a la anterior, a la primera o a la última. Incluso podremos movernos con gestos de deslizamiento a derecha y a izquierda:

Pulsando en el botón de «ListView», nos mostrará un tab con las facturas en formato de vista ListView:

Si pulsamos en una de las facturas, nos mostrará un mensaje con los datos de la factura pulsada:

De la misma forma obtendremos la vista del tab en formato ListBox:

Si pulsamos en el botón «+ Info» de una de las facturas del ListBox, nos mostrará un mensaje con sus datos:

Y en el botón de JSON Depurar, nos mostrará un tab con un Memo que contiene las facturas obtenidas en formato JSON (útil para depuración):

Anexo

Código fuente completo de la unidad UnidadGestionFacturas.pas

A continuación, mostramos el código fuente completo de la unidad de la aplicación multidispositivo en Delphi y Firemonkey, también incluimos enlace a la descarga de todo el proyecto Delphi 12 Community Edition:

Posibles errores y su solución

Exception EBindCompError in module GestionFacturas.exe at 00000000009D65D7.
Error in . No list control editor available for TGrid.

Este error es debido a que no hemos agregado la siguiente unidad al uses:

En el TGrid aparecen los registros pero sin datos.

Esto suele ser debido a que falta algún uses o bien a que no están dispuestos en el orden correcto. Estos son los uses necesarios para un TGrid y su enlace a datos, así como para mostrar otros componentes como TabControl, ScrollBox, Memo, ListView y ListBox: