Notificaciones push en Flutter con Supabase y Entrig

Entrig
Ib Entrig Team

Notificaciones push en Flutter con Supabase y Entrig

En esta guía añadiremos notificaciones push a una aplicación Flutter con Supabase y Entrig.

Entrig es una herramienta para Supabase que envía notificaciones a partir de eventos de la base de datos, sin escribir código de backend. Usaremos una aplicación de chat de grupo; puedes seguir el ejemplo en GitHub.


Requisitos previos

  • Una cuenta y un proyecto de Supabase
  • Una cuenta de Entrig: regístrate en entrig.com
  • El JSON de una cuenta de servicio de Firebase para Android
  • Una clave de autenticación APNs y una cuenta Apple Developer para iOS

Configuración

1. Instala el paquete

Añade Entrig a pubspec.yaml:

dependencies:
  entrig: ^latest_version

Ejecuta flutter pub get.

2. Configura las plataformas

Android: no requiere configuración adicional.

iOS: ejecuta el comando siguiente para configurar las capacidades automáticamente:

flutter pub run entrig:setup

Actualiza AppDelegate, Runner.entitlements e Info.plist; se crean copias de seguridad.

3. Inicializa Entrig

Obtén tu clave API en los ajustes del panel de Entrig y añádela a main.dart:

await Entrig.init(apiKey: 'YOUR_ENTRIG_API_KEY');

4. Registra al usuario

Al iniciar sesión, registra el dispositivo con un identificador de usuario. Normalmente será el ID de Supabase Auth:

final user = Supabase.instance.client.auth.currentUser;
if (user != null) {
  await Entrig.registerUser(userId: user.id);
}

También puedes usar un ID propio, siempre que sea el mismo que se guarda en la tabla users. Entrig lo utiliza para relacionar los dispositivos con las filas de la base de datos. Al cerrar sesión, anula el registro:

await Entrig.unregisterUser();

Consulta las instrucciones del SDK de Flutter para la configuración detallada.


La base de datos de la aplicación

El esquema es un chat de grupo mínimo: los usuarios crean grupos, se unen a ellos y envían mensajes.

group_members
group_id
uuid
user_id
uuid
created_at
timestamptz
groups
id
uuid
created_at
timestamptz
name
text
created_by
uuid
users
id
uuid
created_at
timestamptz
name
text
messages
id
uuid
created_at
timestamptz
content
text
user_id
uuid
group_id
uuid

users es el punto de partida. groups.created_by identifica al propietario; group_members relaciona usuarios y grupos; y messages guarda el contenido con su grupo y emisor.

Cada notificación usa una relación distinta:

  1. Un miembro se une → group_members → groups → created_by hasta el propietario (uno a uno).
  2. Un mensaje nuevo → group_members para todos los miembros salvo el emisor (uno a muchos).
  3. Un grupo nuevo → todos los usuarios registrados salvo el creador (difusión).

Estos patrones —directo, indirecto por tabla intermedia y difusión— cubren la mayoría de casos de uso.

Crear notificaciones

Una notificación de Entrig se define con Trigger (evento), Users (destinatarios) y Message (mensaje).

Directa: un miembro se une

La fila nueva de group_members tiene el user_id de quien se une y el group_id, pero no el ID del propietario. Entrig sigue las claves foráneas group_id → groups → created_by → users.id. Es una conexión Direct: un evento y un destinatario. Añade una condición para omitir la fila creada automáticamente cuando el propietario crea su propio grupo.

  • Tabla / evento: group_members / INSERT
  • Condición: group_members.user_id ≠ groups.created_by
  • Ruta de usuario: group_members.group_id → groups → created_by → users.id
  • Tipo: new_member; campos: groups.name, users.name, group_members.group_id
CampoValor
TítuloNew member joined your group
Cuerpo{{users.name}} joined your group {{groups.name}}

Indirecta mediante tabla intermedia: un mensaje nuevo

Al enviar un mensaje, todos los miembros del grupo deben recibirlo excepto el emisor. La inserción está en messages, pero los destinatarios están en group_members. Entrig toma el group_id, encuentra las filas coincidentes y resuelve cada user_id en un dispositivo registrado. Un filtro excluye al emisor.

  • Tabla / evento: messages / INSERT
  • Conexión: Indirect via Join Table
  • Ruta: messages.group_id → group_members → user_id → users.id
  • Filtro: group_members.user_id ≠ messages.user_id
  • Tipo: new_message; campos: messages.content, users.name, messages.group_id, groups.name

Difusión: un grupo nuevo

Cuando se crea un grupo, Entrig puede notificar a todos los usuarios de la tabla users. No hay una tabla intermedia: es una conexión Broadcast. Excluye al creador, ya que no necesita una notificación de su propio grupo.

  • Tabla / evento: groups / INSERT
  • Conexión: Broadcast (todos los usuarios de users)
  • Filtro: users.id ≠ groups.created_by
  • Tipo: new_group; campos: groups.id, groups.name, users.name

Al crear una notificación, Entrig genera automáticamente el trigger y la función de base de datos en tu proyecto Supabase. No hay nada que desplegar manualmente.


Gestionar notificaciones en el SDK

Las tres notificaciones incluyen un ID de grupo. Usa event.type para enviar al usuario a la pantalla adecuada:

Entrig.onNotificationOpened.listen((NotificationEvent event) {
  switch (event.type) {
    case 'new_member':
      // muestra un diálogo y abre el chat del grupo con event.data['group_id']
      break;
    case 'new_message':
      // abre directamente el chat del grupo con event.data['group_id']
      break;
    case 'new_group':
      // muestra un diálogo y abre el grupo nuevo con event.data['id']
      break;
  }
});

event.type es el valor configurado en el panel. event.data contiene los campos que seleccionaste: IDs, nombres y contenido del mensaje.

Conclusión

Direct, Indirect y Broadcast corresponden a las tres formas fundamentales en que los destinatarios se relacionan con un evento en una base de datos relacional. Una vez elegido el patrón, el resto es configuración. La misma lógica sirve para pedidos, tareas y anuncios de productos.

Consulta la referencia completa del SDK de Flutter y la guía en inglés Push Notifications for Supabase.