Quería contarles una anécdota de app de Finanzas que usaba para manejar Ingresos y Egresos de dinero de mis cuentas. Estaba muy completa, muy prolija, era la primer app de este tipo que usaba, pero hasta que, un día estaba en bus volviendo a casa y no funcionó, y era porque no tenía conexión en mi dispositivo, y ahí me dí cuenta que por lo menos a mí esta aplicación no ya me servía, porque no podía estar pendiente todo el tiempo de tener conexión para poder usar la aplicación, lo esperado era que pudiera ingresar registros en cualquier momento y de cualquier forma y luego, si tengo conexión, poder sincronizar con mi usuario en el servidor si fuese necesario. Quería comentarles esta historia porque creo que viene al tema de este tema que estamos llamando Aplicaciones offline
Entonces ¿A qué nos estamos refiriendo cuando hablamos de offline? “ Offline” no significa “siempre se trabaja sin conexión” , sino que estamos más especificamente hablando de “Aplicaciones eventualmente conectadas”. Funcionan en cualquier momento, y cuando se vuelven a conectar puede cambiar el flujo o la disposición de otras funcionalidades de la aplicación. Pero nos viene la siguiente pregunta
Por qué? Cómo surge esto? Para qué queremos aplicaciones que funionen en estos escenarios? Si bien las posibilidades de estar conectado a internet desde nuestros Smart Devices es más común día a día ya sea por la accesibilidad de contratar servicios 3G, o el aumento de lugares con wifi, existen escenarios donde la no-conectividad es una posibilidad y es bueno que adaptar nuestras aplicaciones para que puedan seguir funcionando de manera productiva: Que se puedan hacer Alta-Baja-Modificación sin depender de un servidor Web. Porque al usuario final le resulta mucho más cómodo, no tiene que estar pendiente de su conexión cuando usa una aplicación.
Aquí les presento algunos escenarios básicos de estas aplicaciones. 2 - Destaco el escenario Point of sales, en el cual tenemos como ejemplo la aplicación de Conaprole. Aquí es una necesidad que funcione sin conexión pues si no puedo generar registros en algún momento es una ganancia que estoy perdiendo. 3 - Aplicación de eventos, como la que muchos de ustedes deben tener en sus dispositivos Android o iOS, no es necesario tener conexión para ver las charlas si ya tienen la aplicación sincronizada. Cuando se conecten de vuelta su aplicación se puede sincronizar por cambios hechos en el servidor en cualquier momento.
Pasemos brevemente a ver cómo se modelan este tipo de aplicaciones
Hasta ahora teníamos esta arquitectura para la creación de aplicaciones Online. Componentes ruby, C# o java para manejar el servidor web, hay componentes de bases de datos, redes, servicios, manejo de Json, y generación de código nativo para los dispositivos ya sean Android e iOS. Hay mucha técnología de fondo en todo este tema.
Cuando queremos modelar aplicaciones Offline nos queda de esta forma. La aplicación tiene su propia base de datos Lo que quiero destacar de este modelo es que ahora nuestros generadores SD están creando toda la lógica que teníamos en nuestro servidor web también en el dispositivo usando código nativo.
Con la estructura en mente de lo que queremos hacer pasamos a cómo enfrentarnos con este tipo de problemas utilizando GeneXus. Quiero que vean de verdad lo fácil que es esto.
La generación de aplicaciones offline para SmartDevices está soportada a partir de la versión Tilo de GeneXus y está disponible para los generadores Android e iOS
Es importante mencionarles que para generar aplicaciones Offline estamos generando más código nativo. Por lo que, a diferencia de cuando prototipabamos aplicaciones Online utilizando la aplicación Knowledge Base Navigator, ahora es necesario tener la aplicación instalada en un dispositivo para poder utilizarla. Por lo que no funciona una aplicación Offline con KBN
Para soportar la generación de aplicaciones Offline con GeneXus , existe una nueva propiedad a nivel de objetos en GeneXus la cual se llama Connectivity Support Property: Esta propiedad aplicada le indica al Generador si el objeto a generar va a tener comportamiento Online o Offline básicamente. Para eso la propiedad tiene 3 posibles valores:
Online : Como se viene usando desde el Upgrade 2 , la aplicación se comunica únicamente con el servidor utilizando servicios Rest o HTTP Offline : Le da la pauta al generador de que la aplicación va a poder funcionar en ambientes de conectividad limitada o nula. La aplicación siempre se va a conectar con la base de datos interna al dispositivo. Inherit : Hereda la propiedad del objeto main que empezó el árbol de llamadas hasta el objeto. Nos vamos a centrar ahora en la propiedad Offline obviamente.
Así es como empezamos el camino para generar nuestra aplicación offline para SmartDevices, simplemente eligiendo la opción Offline sobre el objeto Main de nuestra aplicación. Qué debemos hacer luego? Debemos compilar el objeto main con Connectivity Support Offline, y GeneXus va a hacer un análisis de impacto de tablas y elige qué tablas que van a quedar en la Base de datos Interna del dispositivo.
Entonces luego de compilar objeto main que tiene Connectivity Support en Offline, GeneXus genera un nuevo objeto OfflineDatabase asociado al objeto main.
Aquí tenemos cómo se muestra el objeto en el IDE y el análisis de impacto luego de hacerle build al objeto main con Connectivity Support en Offline. En esta KB de ejemplo tenemos 4 tablas, y las tablas que se GeneXus eligió son todas porque el objeto Main tiene referencias a estas tablas.
Cómo sabe que tablas elegir? Según las referencias mediante objetos offline a tablas que tiene el objeto main. Se crean todas las tablas referenciadas y sus tablas extendidas. Acrordarse de que los demás objetos tiene ConnectivitySupport en inherit por defecto Es posible tener desde nuestra aplicación acceso a todas las secciones indicando cuales de ellas se estarán disponibles offline y cuales no utilizando la propiedad Connectivity Support
Es este ejemplo vamos a ver qué pasa cuando existen objetos con diferentes valores en la propiedad ConnectivitySupport. Esta opción de elegir que información va a estar o no disponible offline nos da la libertad de decidir qué partes de nuestra aplicación van a poder funcionar offline o no. También tiene la opción de agregarle condiciones, con esto podemos decidir qué registros queremos que se guarde en la base de datos offline y que registros no. Un ejemplo básico puede ser que guarde únicamente los registros recientes, de hace una semana por ejemplo. De esta forma contenemos en nuestro dispositivo solo un subconjunto de todo lo que podría ser el servidor, que en ocasiones puede ser muy grande.
Bueno hasta aquí podríamos decir que ya tenemos la aplicación Offline lista para generar . Y a es ejecutable en sus dispositivos , se puede hacer Alta/Baja y Modificación de registros estando desconectado. Pero nos está faltando el último y quizas más importante elemento de las aplicaciones de este tipo que es la sincronización
La sincronización es una funcionalidad fundamental en este tipo de aplicaciones . En este paso vamos a decidir qué pasa cuando modificamos o agregamos registros en nuestro device estando offline, y luego nos conectamos. Qué pasa con esos registros nuevos? Por el otro lado, mientras estaba offline, se pudieron agregar registros nuevos en el servidor, por lo que yo quisiera t ener actualizada mi base de datos al volverme a conectar .
Para empezar con la sincronización , debemos primero saber en que estado de conectividad se encuentra el dispositivo. Para ello introducimos una nueva API, llamada NetworkAPI
La NetworkAPI cuenta con un dominio nuevo llamado NetworkAPIConnectionStatus el cual cuenta con 3 valores 0,1 y 2 para indicar conectividad Nula, wifi o WAN respectivamente. A su vez tenemos la propiedad ApplicationServerURL que nos devuelve la propiedad ServiceURL que está a nivel de el Generador de Smart Devices. Y los métodos IsServerAvailable, que nos da verdadero si el ServiceURL está accesible Y el método Type que nos dice en qué estado de conexión se encuentra el ServiceURL
Usando la Network API es posible ahora saber cuándo uno puede o no sincronizar con el servidor. Cómo logramos hacer la sincronización?
Es posible el uso de Procedimientos y DataProviders expuestos como WebServices o servicios REST. Y programar manualmente toda la lógica de sincronización de las tablas del Device con las tablas del servidor. Para los que tengan su propio mecanismo de sincronización quiero que sepan que es posible, pero para aquellos que no quieran pasar trabajo, GeneXus tiene una nueva API llamada Synchronization
Esta API nos va a ahorrar horas y horas de programación sobre el tema de sincronización.
Synchronization API tiene dos métodos RECEIVE(): Los datos son definido por las conditions del objeto OfflineDatabase del main object. SEND(): Los datos que el dispositivo envia al server corresponden a todos los Business Components salvados desde el último envío. Las actualizaciones realizadas mediante procedimientos no son enviadas.
Estos métodos hacen la sincronización hacia los dos lados automáticamente, de todas formas, lo seguimos llamando Sincronización Manual, por qué? Porque es el desarrollador que indica cuándo realizar la sincronización. Y capaz que ahora alguien se está preguntando, puede ser más fácil que escribir 7 líneas? tengo que escribir 7 lineas de código para hacer toda la sincronización entre cada una de las tablas de mi dispositivo y las del servidor, teniendo cuidado con las modificaciones que se hicieron, contemplando problemas de sincronización como el tema de los registros con atributos identificadores, entre una infinidad de cosas mas? Puede ser más fácil? Y la respuesta es sí.
GeneXus, a partir de la versión Tilo Beta2 que será liberada a fines de Octubre, tiene incluido propiedades que hacen que ustedes no tenga que hacer nada para que su dispositivo se sincronice con el servidor.
Tenemos esta propiedad, que está en las propiedades del objeto OfflineDatabase que nos va a ahorra más horas y horas de desarrollo. Data Synchronizaction Criteria Por defecto en Automatic, deja habilitada otra propiedad llamada Minimun time between Synchronizations con la cual especificamos cada cuántos segundos se va a sincronizar nuestro dispositivo con el servidor. En definitiva, se van a ejecutar los mismos métodos Receive() y Send(), de forma automática en un intervalo especificado por la propiedad Minimun time Between Syncronizations.
Les quise presentar el tema de sincronización de esta manera, porque la verdad quiero que se lleven esto, quiero que vean lo fácil que es aplicar esta funcionalidad en nuestra aplicación, básicamente, una vez más con GeneXus estos problemas gigantes ser resuelven activando una propiedad sobre un objeto determinado. Es tan simple que hasta la propiedad por defecto es Automatic, o sea que únicamente cambiando la propiedad ConnectivitySupport del objeto main a Offline, ya queda su aplicación funcionando Offline, y con sincronización automática integrada, sincronizándose cada 600 segundos
Ahora quería presentarles una demostración de cómo funciona la sincronización:
Por último pasemos a ver cómo pasar una aplicación que ya tienen Online a Offline.
Para empezar, lo primero que deberían hacer es cambiarle la propiedad ConnectivitySupport del main object de su aplicación a OFFLINE Y bueno ahí tienen ya su aplicación funcionando Offline. Qué quiero decirles con esto? La versión Tilo de GeneXus está todavía en fase beta, y con esto pueden sin ningún problema desarrollar sus aplicaciones usando GeneXus Evolution 2. Lo único que tienen que hacer es configurar las popiedades Connectivity Support de los objetos que concideren que se van a ejecutar Offline o Online. El resto lo hace GeneXus automáticamente.
Quiero que de verdad se lleven esto en mente, que es con GeneXus esto es muy fácil, estamos hablando de solucionar problemas enormes cambiando el valor de una propiedad de un objeto. Hacer todo esto de otra forma llevaría mucho trabajo y tiempo. Por el otro lado si ya tienen sus aplicaciones funcionando Online pasarlo a Offline es igual de simple. Así que los invitamos a que le presten atención a este tema, puede ser un componente muy importante o esencial para sus aplicaciones. Quiero que se vayan sabiendo que esto les da nuevas oportunidades a ustedes porque habilita nuevos escenarios a cubrir. Quiero que tengan en mente que con Genexus se puede todo esto. Y quiero que sepan que con todo esto y sus ideas, con respecto a SmartDevices ahora tienen todo para hacer la diferencia. Muchas gracias y cualquier consulta espero que los pueda ayudar