
В этом руководстве мы добавим 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.
База данных приложения
Схема описывает простой групповой чат: пользователи создают группы, вступают в них и отправляют сообщения.
Отправная точка — таблица users. Поле groups.created_by определяет владельца группы, group_members связывает пользователей и группы, а messages хранит текст сообщения, группу и отправителя.
Для уведомлений используются три типа связей:
- Вступление участника →
group_members → groups → created_byк владельцу (один к одному). - Новое сообщение → через
group_membersвсем участникам, кроме отправителя (один ко многим). - Новая группа → всем зарегистрированным пользователям, кроме создателя (рассылка).
Прямая связь, косвенная связь через таблицу и рассылка покрывают большинство сценариев уведомлений.
Создание уведомлений
Уведомление в 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.