Push-уведомления Flutter с Supabase и Entrig

Entrig
Ib Entrig Team

Push-уведомления Flutter с Supabase и Entrig

В этом руководстве мы добавим push-уведомления в Flutter-приложение, использующее Supabase и Entrig.

Entrig — инструмент для Supabase, который отправляет уведомления по событиям в базе данных без написания серверного кода. В качестве примера соберём групповой чат; исходный пример приложения есть на GitHub.

Что потребуется

  • Учётная запись Supabase с проектом
  • Учётная запись Entrig на entrig.com
  • JSON сервисного аккаунта Firebase для Android-уведомлений
  • Ключ аутентификации APNs и аккаунт Apple Developer для iOS

Настройка

1. Установите пакет

Добавьте Entrig в pubspec.yaml и выполните flutter pub get:

dependencies:
  entrig: ^latest_version

2. Настройте платформы

Android: дополнительная настройка не нужна.

iOS: выполните команду, чтобы автоматически включить нужные возможности:

flutter pub run entrig:setup

Команда обновит AppDelegate, Runner.entitlements и Info.plist, а также создаст резервные копии.

3. Инициализируйте приложение

Возьмите API-ключ в настройках панели Entrig и добавьте его в main.dart:

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

4. Зарегистрируйте пользователя

При входе в систему зарегистрируйте устройство с ID пользователя. Обычно это ID пользователя Supabase Auth:

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

Можно использовать и собственный ID, если он совпадает с идентификатором в таблице users. Entrig связывает с ним устройства и строки базы данных. При выходе отмените регистрацию:

await Entrig.unregisterUser();

Подробности по платформам доступны в документации Flutter SDK.

База данных приложения

Схема описывает простой групповой чат: пользователи создают группы, вступают в них и отправляют сообщения.

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. Поле groups.created_by определяет владельца группы, group_members связывает пользователей и группы, а messages хранит текст сообщения, группу и отправителя.

Для уведомлений используются три типа связей:

  1. Вступление участника → group_members → groups → created_by к владельцу (один к одному).
  2. Новое сообщение → через group_members всем участникам, кроме отправителя (один ко многим).
  3. Новая группа → всем зарегистрированным пользователям, кроме создателя (рассылка).

Прямая связь, косвенная связь через таблицу и рассылка покрывают большинство сценариев уведомлений.

Создание уведомлений

Уведомление в Entrig определяется тремя частями: Trigger (событие базы данных), Users (получатели) и Message (текст).

Прямая связь: в группу вступил участник

Новая строка group_members содержит user_id вступившего пользователя и group_id, но не ID владельца. Entrig проходит по внешним ключам group_id → groups → created_by → users.id. Это тип связи Direct: одно событие и один получатель. Добавьте условие, которое исключит автоматическое добавление владельца при создании им собственной группы.

  • Таблица / событие: group_members / INSERT
  • Условие: group_members.user_id ≠ groups.created_by
  • Путь к пользователю: group_members.group_id → groups → created_by → users.id
  • Тип: new_member; поля: groups.name, users.name, group_members.group_id

Косвенная связь через таблицу: новое сообщение

После отправки сообщения уведомление должны получить все участники группы, кроме автора. Вставка происходит в messages, но получатели находятся в group_members. Entrig берёт group_id, находит соответствующие строки участников и сопоставляет каждый user_id с зарегистрированным устройством.

  • Таблица / событие: messages / INSERT
  • Связь: Indirect via Join Table
  • Путь: messages.group_id → group_members → user_id → users.id
  • Фильтр получателя: group_members.user_id ≠ messages.user_id
  • Тип: new_message; поля: messages.content, users.name, messages.group_id, groups.name

Рассылка: создана новая группа

При создании группы Entrig может уведомить всех пользователей из таблицы users. Промежуточная таблица не нужна: это связь Broadcast. Исключите создателя — ему не нужно уведомление о собственной группе.

  • Таблица / событие: groups / INSERT
  • Связь: Broadcast (все пользователи из users)
  • Фильтр: users.id ≠ groups.created_by
  • Тип: new_group; поля: groups.id, groups.name, users.name

Когда уведомление создано, Entrig автоматически добавляет триггер и функцию базы данных в проект Supabase. Ручной деплой не требуется.

Обработка уведомлений в SDK

Все три уведомления включают ID группы. Используйте event.type, чтобы открыть нужный экран:

Entrig.onNotificationOpened.listen((NotificationEvent event) {
  switch (event.type) {
    case 'new_member':
      // показать диалог и открыть чат event.data['group_id']
      break;
    case 'new_message':
      // сразу открыть чат event.data['group_id']
      break;
    case 'new_group':
      // показать диалог и открыть группу event.data['id']
      break;
  }
});

event.type — значение, заданное в панели управления. В event.data передаются выбранные поля: ID, имена и текст сообщения.

Итог

Direct, Indirect и Broadcast соответствуют трём основным способам связать получателей с событием в реляционной базе данных. После выбора подходящего паттерна остаётся только настройка. Тот же подход подходит для заказов, назначений задач и продуктовых анонсов.

Смотрите полный справочник Flutter SDK и английский обзор Push Notifications for Supabase.