Envío de notificaciones push con Firebase Cloud Messaging (FCM) usando .NET Core 🚀

Firebase Cloud Messaging (FCM) de Google es un servicio que permite enviar notificaciones push a aplicaciones móviles, aplicaciones web y otros dispositivos conectados.

FCM ofrece una API HTTP que permite enviar mensajes desde servidores backend hacia dispositivos cliente de forma segura y escalable.

Las notificaciones pueden enviarse utilizando tres tipos principales de destino.


Tipos de destino de notificaciones en FCM

1️⃣ Token de dispositivo (Device Token)

Permite enviar una notificación directamente a un dispositivo específico.

Cada instalación de una aplicación genera un token único proporcionado por FCM. Este token identifica la instancia de la aplicación en ese dispositivo.

El backend puede almacenar este token para enviar notificaciones personalizadas.


2️⃣ Tema (Topic)

Los topics permiten enviar notificaciones a múltiples dispositivos usando un modelo publisher–subscriber.

Los dispositivos se suscriben a un topic y cualquier mensaje enviado a ese topic será recibido por todos los dispositivos suscritos.

Ejemplo de topics:

news
promotions
weather_alerts

3️⃣ Condicional

Las notificaciones condicionales permiten definir expresiones lógicas para enviar mensajes a múltiples topics.

Ejemplo:

'news' in topics && 'mexico' in topics

Esto enviará la notificación únicamente a dispositivos suscritos a ambos topics.


Autenticación con Firebase Cloud Messaging

Para enviar notificaciones usando la API HTTP v1 es necesario autenticarse usando OAuth2 mediante una cuenta de servicio de Google.

Crear la cuenta de servicio

  1. Ir a Firebase Console
  2. Abrir Project Settings
  3. Seleccionar Service Accounts
  4. Generar una nueva clave privada
  5. Descargar el archivo:
serviceAccount.json

Este archivo contiene las credenciales necesarias para autenticarse contra la API de FCM.


Obtener un Access Token usando Google CLI

Una forma sencilla de probar las notificaciones es obtener un Access Token temporal con la CLI de Google.

Activar la cuenta de servicio:

gcloud auth activate-service-account --key-file="tu-service-account.json"

Obtener el access token:

gcloud auth print-access-token

Este token se utiliza en las peticiones HTTP como un Bearer Token.


Enviar una notificación con curl o Postman

Ejemplo de petición usando curl:

curl --location --globoff 'https://fcm.googleapis.com/v1/projects/{{project_id}}/messages:send' \
--header 'Authorization: Bearer {{access_token}}' \
--header 'Content-Type: application/json' \
--data '{
"message": {
"token": "{{device_token}}",
"notification": {
"title": "Prueba desde Postman",
"body": "Prueba desde Postman"
},
"data": {
"accion": "test",
"id": "123"
},
"android": {
"priority": "HIGH"
},
"apns": {
"headers": {
"apns_priority": "10"
},
"payload": {
"aps": {
"sound": "default",
"contentAvailable": 1
}
}
}
}
}'

Campos importantes:

CampoDescripción
notificationInformación visible de la notificación
dataDatos personalizados enviados a la aplicación
tokenToken del dispositivo destino
topicTopic de destino
android / apnsConfiguración específica por plataforma

Enviar notificaciones desde .NET Core

En aplicaciones .NET Core / .NET 8 / .NET 9 podemos utilizar la API HTTP v1 de FCM usando las librerías de autenticación de Google.

Paquetes NuGet necesarios

--Requerido
Google.Apis.Auth

--Opcionales, para un cliente de alto nivel
FirebaseAdmin
FirebaseAdmin.Messaging

También se puede usar directamente HttpClient, como en el siguiente ejemplo.


Ejemplo: aplicación de consola en .NET

// Program.cs (.NET 8/9)using Google.Apis.Auth.OAuth2;
using System.Net.Http.Headers;
using System.Net.Http.Json;// Configuración
const string projectId = "TU_PROJECT_ID";
const string deviceToken = "TU_DEVICE_TOKEN";
const string topic = "news";// Obtener credenciales desde GOOGLE_APPLICATION_CREDENTIALS
GoogleCredential credential = await GoogleCredential
.GetApplicationDefaultAsync();credential = credential.CreateScoped(
"https://www.googleapis.com/auth/cloud-platform");// Obtener access token
var accessToken = await credential
.UnderlyingCredential
.GetAccessTokenForRequestAsync();using var http = new HttpClient();http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", accessToken);var url = $"https://fcm.googleapis.com/v1/projects/{projectId}/messages:send";// Ejemplo 1: enviar a un device token
var payloadToToken = new
{
message = new
{
token = deviceToken,
notification = new
{
title = "Hola desde .NET",
body = "Este es un mensaje de prueba vía FCM"
},
data = new
{
accion = "abrir_detalle",
id = "12345"
},
android = new
{
priority = "HIGH"
}
}
};// Ejemplo 2: enviar a un topic
var payloadToTopic = new
{
message = new
{
topic = topic,
notification = new
{
title = "Noticia",
body = "Nueva actualización disponible"
},
data = new
{
tipo = "update",
version = "2.0"
}
}
};// Elegir payload
var body = payloadToToken;var response = await http.PostAsJsonAsync(url, body);var responseText = await response.Content.ReadAsStringAsync();Console.WriteLine($"Status: {response.StatusCode}");
Console.WriteLine(responseText);

Ejecutar la aplicación

Primero configura la variable de entorno con el archivo de credenciales.

Windows

set GOOGLE_APPLICATION_CREDENTIALS=C:\ruta\clave.json

Linux / macOS

export GOOGLE_APPLICATION_CREDENTIALS=/ruta/clave.json

Luego ejecuta la aplicación:

dotnet run

Si todo está configurado correctamente, FCM devolverá una respuesta similar a:

{
"name":"projects/mi-proyecto/messages/0:1700000000000000%abcdef"
}

Esto indica que el mensaje fue aceptado por Firebase.


Conclusión

Firebase Cloud Messaging permite implementar fácilmente un sistema de notificaciones push escalable para aplicaciones móviles y web.

Utilizando la API HTTP v1 y OAuth2, es posible enviar notificaciones desde cualquier backend, incluyendo aplicaciones desarrolladas con .NET Core.

Esta integración es especialmente útil para:

  • Notificaciones en tiempo real
  • Alertas del sistema
  • Mensajes promocionales
  • Actualizaciones de aplicaciones

ASP.Net y SignalR

SignalR es una componente de Microsoft para ASP.Net, su objetivo es agregar funcionalidad web en tiempo real a las aplicaciones, de tal forma que permite hacer que el código del servidor actualice o inserte contenido en los clientes conectados en tiempo real, similar a una consola de chat.

Es una abstracción de múltiples tecnologías PUSH, soporta diferentes protocolos de comunicación, los cuales negocia y utiliza en base a las características y/o limitaciones del servidor y el navegador web.

Soporta 4 protocolos de trasporte:

  • webSockets
  • foreverFrame
  • serverSentEvents
  • longPolling

Y maneja una arquitectura como la siguiente, donde HubsAPI y PersistentConnection API son 2 modelos diferentes de implementación del lado del Servidor.

Diagrama arquitectonico de SignalR

En general, simplifica mucho el proceso de realizar notificaciones Push en aplicaciones web y elimina la dependencia con servicios Push de terceros como IBM Bluemix o Google Firebase.

Para implementaciones en Azure, existe un componente llamado Azure SignalR el cual provee integración con componentes montados en Azure y resuelve algunos problemas de escalamiento horizontal que se generan al utilizar SignalR en Azure.

Para mayor información respecto a implementaciones dejo un ejemplo de implementación con .Net Framework y algunas referencias para .Net Core y .Net Framework.

Por el momento es todo, deja un comentario si te fue de utilidad.

Referencias:

.Net Core

https://learn.microsoft.com/es-mx/aspnet/core/signalr/introduction?view=aspnetcore-7.0&WT.mc_id=dotnet-35129-website

https://learn.microsoft.com/es-mx/aspnet/core/tutorials/signalr?view=aspnetcore-7.0&tabs=visual-studio

.Net Framework

https://learn.microsoft.com/en-us/aspnet/signalr/overview/getting-started/

Otros

https://en.wikipedia.org/wiki/Push_technology

Operaciones con objetos DateTime y TimeSpan

En esta ocasión les comparto unos ejemplos muy básicos de comparación de fechas y horas.

Le mostrare una pequeña aplicación de consola que realice para unas pruebas.

El objetivo es comparar 2 horas con minutos, tipo 13:30, guardarlos en un TimeSpan y compararlos.

Console.WriteLine("Escribe una hora en formato HH:mm");
Console.WriteLine("Por ejemplo: 13:30");
TimeSpan time1 = TimeSpan.Parse(Console.ReadLine());
Console.WriteLine("Escribe otra hora en formato HH:mm");
TimeSpan time2 = TimeSpan.Parse(Console.ReadLine());

if (time1 > time2)
	Console.Write("La 1ra hora es mayor que la 2da");
else if (time1 < time2)
	Console.Write("La 2da hora es mayor que la 1ra");
else
	Console.Write("La 1ra hora es igual que la 2da");

Console.Read();

Entrega una salida como la siguiente:

Incluye una segunda opción donde obtiene la diferencia en horas entre dos fechas.

Console.WriteLine("Escribe un dia del mes:");
int dia1 = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Escribe otro dia del mes:");
int dia2 = Convert.ToInt32(Console.ReadLine());

DateTime date1 = new DateTime(DateTime.Now.Year, DateTime.Now.Month, dia1);
DateTime date2 = new DateTime(DateTime.Now.Year, DateTime.Now.Month, dia2); 

int total = Convert.ToInt32(date2.Subtract(date1).TotalHours);

Console.WriteLine("Horas de diferencia entre las 2 fechas: " + total.ToString());

Console.Read();

La segunda parte quedaría así:

Por el momento es todo, posteriormente iré agregando mas ejemplos a esta publicación.

Son unos ejemplos simples, espero a alguien le sean útiles.

Código de ejemplo:

https://pabloroman.mx/ejemplos/Test_DateTime&TimeSpan.zip

Programar Policies para Endpoints de Azure API Management

Iniciando en este mundo de las Policies en API Managment tuve algunos problemas en encontrar una forma medianamente optima para programar dichas policies de una forma no tan tediosa o arcaica.

El mejor editor que encontré y recomiendo es Visual Studio Code en conjunto con la extensión Azure API Managment. Te permite conectarte directamente con tu instancia de API Management e interactuar con los objetos. Tiene algunas pequeñas fallas en la interfaz, pero es mucho mejor que otros editores.

https://learn.microsoft.com/en-us/azure/api-management/visual-studio-code-tutorial

Incluso puedes llegar a debugear una Policy, aunque el proceso de debugeo deja algo que desear.

https://learn.microsoft.com/en-us/azure/api-management/api-management-debug-policies

Para iniciar en la programación recomiendo las siguientes lecturas:

https://learn.microsoft.com/en-us/azure/api-management/api-management-policies

https://learn.microsoft.com/en-us/azure/api-management/api-management-advanced-policies

https://learn.microsoft.com/en-us/azure/api-management/api-management-policy-expressions

Para información mas general de API Management consultar:

https://learn.microsoft.com/en-us/azure/api-management/

Herramientas online para programadores

En esta ocasión les comparto algunas herramientas que uso en mi día a día, espero les sean de utilidad.

Webtoolkit Online

Conjunto muy completo de herramientas en un solo sitio

www.webtoolkitonline.com

Code Beautify

Otro sitio con un conjunto de herramientas muy completo

codebeautify.org

XML Viewer

Permite visualizar, formatear, convertir, minificar archivos XML, entre otras cosas

https://codebeautify.org/xmlviewer

JSON Viewer

Permite visualizar y formatear datos en formato JSON

Online JSON Viewer (stack.hu)

JSON Formatter

Para formatear y validar datos en formato JSON

https://jsonformatter.curiousconcept.com

DotNetFiddle

Compilador de codigo C# en línea

C# Online Compiler | .NET Fiddle (dotnetfiddle.net)

C# Viewer

Visualizador, compilador y minificador de codigo C#

https://codebeautify.org/csharpviewer

Excel To Json

Como su nombre lo dice, permite convertir la informacion de un excel a JSON

Excel To Json Converter – BeautifyTools.com

APP Diagrams

Herramienta para generar diversos tipos de diagramas (Mapas mentales, UML, etc, etc).

diagrams.net

BPMN Sketch Miner

Herramienta para generar diagramas mediante la Notacion de Modelado de Procesos de Negocios (BPMN)

BPMN Sketch Miner (bpmn-sketch-miner.ai)

Web Sequence Diagrams

Otra herramienta para generar diagramas de forma fluida

https://www.websequencediagrams.com/

PlantText

Herramienta para generar diagramas UML

https://www.planttext.com/

https://plantuml.mseiche.de/