Unofficial Content

Este artículo describe los pasos que debes seguir para obtener la localización de un dispositivo, que tiene instalada tu aplicación móvil, desde una Silent Notification utilizando el proveedor One Signal.

Paso 1

Configurar las Push Notifications for Android, o Push Notifications for Apple

Paso 2

Crear un evento en el Native Mobile Main Object para obtener la ubicación del dispositivo, el mismo no está asociado a ningún control.

Cuando la app está en ejecución o en memoria

Supón que necesitas guardar en la base de datos la ubicación para tener un historial del tracking por dispositivo, para ello utiliza un código como este:

Event 'GetLocation'
    Composite
        &ClientInformationID = ClientInformation.Id
        &GeoLocationInfo = GeneXus.Common.Geolocation.GetMyLocation(0, 0, false, true)
        SaveLocation(&ClientInformationID,&GeoLocationInfo)
    EndComposite
EndEvent

Donde &ClientInformationID es de tipo Varchar que recupera el Id de la API ClientInformation y &GeoLocationInfo es de tipo GeolocationInfo

SaveLocation es un procedimiento que guarda la localización del dispositivo.

Cuando la app no está en ejecución

El evento GetLocation no funciona cuando la app no está en ejecución o en memoria. Esto se debe a que si se saca la aplicación de la memoria, el GetMyLocation method devuelve siempre vacía la localización.

En caso de ser necesario que se devuelva la localización, aunque la aplicación no esté ejecutando, es necesario forzar la ejecución de tracking usando la propiedad UseForeground.

El evento entonces debe ser así:

Event 'GetLocation'
    Composite
        &ClientInformationID = ClientInformation.Id
        &TrackingParameters.ChangeInterval = 0
        &TrackingParameters.Distance = 0
        &TrackingParameters.UseForegroundService= True
        GeneXus.Common.Geolocation.StartTracking(&TrackingParameters)
        &GeoLocationInfo = GeneXus.Common.Geolocation.GetMyLocation(0, 0, false, true) 
        SaveLocation(&ClientInformationID,&GeoLocationInfo) EndComposite EndEvent
        GeneXus.Common.Geolocation.EndTracking()
    EndComposite
EndEvent

Tenga en cuenta que el SDK de iOS no permite más que se haga location cuando la aplicación no está en foreground, conforme esta documentación. En este caso, las localizaciones serán todas grabadas al momento que la aplicación esté activa nuevamente. Para que funcione la localización, aunque la aplicación esté apagada, se pueden hacer External Objects, usando una de las APIs provistas por apple

Es importante tener en cuenta que a cada nuevo SDK se tornan más restrictivas, por seguridad o por privacidad, siempre se puede dejar de funcionar el envío de localización a partir de una silent notificación, particularmente cuando la aplicación esté en background o apagada.

Paso 3

Configurar el envío de la Silent Notification. Por ejemplo, desde un Procedure object se puede programar el siguiente código:

&NotificationEvent = new()
&NotificationEvent.Name = !'GetLocation'

&NotifConfiguration = new()
&NotifConfiguration.ApplicationId = !'SDLocation'
&NotificationDelivery = new()
&NotificationDelivery.Priority= PushNotificationPriority.High
//PushNotificationPriority.High es importante para que despierte el device cuando entra en Doze mode
for each // Movil 
    where DeviceID = &DeviceID
      SendEvent(&NotifConfiguration, DeviceToken, &NotificationEvent, &NotificationDelivery, &Messages, &NotifSuccess)
endfor

Y en las reglas se pasa el device del cual queremos tener su ubicación:

parm(in:&DeviceID);

Donde:

&GXPushNotification es de tipo RemoteNotification
&NotificationEvent es de tipo GeneXus.Common.Notifications.Event
&NotifConfiguration es de tipo GeneXus.Common.Notifications.Configuration
&NotificationDelivery es de tipo GeneXus.Common.Notifications.Delivery
&Messages es de tipo Genexus.Common.Messages
&NotifSuccess es de tipo Numeric

&NotificationEvent, &NotifConfiguration, &NotificationDelivery son SDT de la API Notification Provider, SendEvent es un procedimiento incluido en la misma API.

Por último, desde un Web Panel se puede llamar a este procedimiento desde un botón.

Paso 4

Seleccionar One Signal como proveedor para nuestras notificaciones. Es importante registrar la aplicación para usar el Servicio.

Para Android, en el main program es necesario configurar la Use Background Location property = True.

Last update: February 2024 | © GeneXus. All rights reserved. GeneXus Powered by Globant