Ya casi es imprescindible que a través de nuestras aplicaciones le hagamos llegar notificaciones push a nuestros usuarios.
Ya sea para nuevas actualizaciones, para recordarles algún dato, o por otros innumerables motivos, las notificaciones push son importantes.
Para el que ya conoce las API de Google, y para aquellos que todavía no, es necesario obtener un Token desde la API de Firebase para poder identificar al usuario y así hacerle llegar la notificación.
Para aquellos que ya han programado alguna notificación push con anterioridad, sabrá que en Delphi 10.4, ha cambiado un poquito, y tenemos que retocar el código para poder obtener el Token.
Obtener Token de Firebase
Está de más enseñar como crear el proyecto en la web de Firebase ya que es sumamente sencillo.
Solo basta con registrarnos, crear el proyecto y registrar nuestra App para que nos descargue un archivo llamado google-services.json.
En dicho archivo tendremos toda la configuración de nuestro proyecto para poder configurarlo.
Configurar Firebase en nuestra App
Para poder configurar Firebase en nuestra app, ingresamos al menú Project -> Options -> Application -> Services y en Target seleccionamos nuestra versión de Android (32 o 64 bits).
Presionamos sobre el botón Import y seleccionamos el archivo google-services.json que descargamos anterioridad.
Automáticamente se llenaran los campos de configuración. Si nuestra App va a ser compilada para 32 y 64 bits, deberemos realizar el mismo paso en las dos versiones.
Una vez importada la configuración de Firebase, deberemos activar dentro de Entitlement List la opción recive push notifications.
Como paso siguiente, vamos a codificar. Creamos el evento OnCreate del formulario principal (o en cualquier otro evento donde queramos recibir el token) donde llamaremos al siguiente procedimiento:
var
FDeviceId: string;
FDeviceToken: string;
...
uses
FMX.PushNotification.Android;
...
procedure TFormMain.ShowToken;
var
PushService: TPushService;
ServiceConnection: TPushServiceConnection;
Notifications: TArray<TPushServiceNotification>;
begin
PushService := TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.FCM);
ServiceConnection := PushServiceConnection.Create(PushService);
ServiceConnection.Active := True;
ServiceConnection.OnChange := OnServiceConnectionChange;
ServiceConnection.OnReceiveNotification := OnReceiveNotificationEvent;
FDeviceId := PushService.DeviceIDValue[TPushService.TDeviceIDNames.DeviceId];
MemoLog.Lines.Add('DeviceID: ' + FDeviceId);
MemoLog.Lines.Add('Ready to receive!');
// Checks notification on startup, if application was launched fromcold start
// by tapping on Notification in Notification Center
Notifications := PushService.StartupNotifications;
if Length(Notifications) > 0 then
begin
MemoLog.Lines.Add('-----------------------------------------');
MemoLog.Lines.Add('DataKey = ' + Notifications[0].DataKey);
MemoLog.Lines.Add('Json = ' + Notifications[0].Json.ToString);
MemoLog.Lines.Add('DataObject = ' + Notifications[0].DataObject.ToString);
MemoLog.Lines.Add('-----------------------------------------');
end;
end;
Como vemos en el procedimiento anterior, se instancian dos eventos:
ServiceConnection.OnChange := OnServiceConnectionChange;
ServiceConnection.OnReceiveNotification := OnReceiveNotificationEvent;
Implementación de OnServiceConnectionChange que se ejecuta al cambiar el token de dispositivo.
procedure OnServiceConnectionChange(Sender: TObject;
PushChanges: TPushService.TChanges);
var
PushService: TPushService;
begin
PushService := TPushServiceManager.Instance.GetServiceByName(TPushService.TServiceNames.FCM);
if TPushService.TChange.DeviceToken in PushChanges then
begin
FDeviceToken := PushService.DeviceTokenValue[TPushService.TDeviceTokenNames.DeviceToken];
MemoLog.Lines.Add('Firebase Token: ' + FDeviceToken);
Log.d('Firebase device token: token=' + FDeviceToken);
end;
if (TPushService.TChange.Status in PushChanges) and (PushService.Status = TPushService.TStatus.StartupError) then
MemoLog.Lines.Add('Error: ' + PushService.StartupError);
end;
Y por último la implementación del evento OnReceiveNotificationEvent para recibir los datos:
procedure OnReceiveNotificationEvent(Sender: TObject;
const ServiceNotification: TPushServiceNotification);
var
MessageText: string;
begin
MemoLog.Lines.Add('-----------------------------------------');
MemoLog.Lines.Add('DataKey = ' + ServiceNotification.DataKey);
MemoLog.Lines.Add('Json = ' + ServiceNotification.Json.ToString);
MemoLog.Lines.Add('DataObject = ' +
ServiceNotification.DataObject.ToString);
MemoLog.Lines.Add('---------------------------------------');
end;
Para que funcione este ejemplo, deberemos tener en nuestro formulario un TMemo llamado MemoLog donde se mostrarán los datos del Id de Dispositivo y el Token de Firebase.