Supabase не отправляет push-уведомления автоматически при событиях в базе данных. Вызова supabase.notifications.send() не существует. Чтобы отправить уведомление, нужно собрать цепочку: триггер Postgres, Edge Function, учётные данные FCM и APNs, токены устройств и код выбора получателей.
Этот подход работает и хорошо документирован. Ниже — его составные части и управляемая альтернатива. Для Flutter доступно руководство Flutter; англоязычные руководства есть также для React Native, Expo, Capacitor, iOS и Android.
Что нужно для push-уведомлений
Каждому push нужны четыре вещи: токен устройства, место для его хранения, триггер, определяющий время отправки, и служба доставки до устройства — FCM для Android и APNs для iOS. Здесь мы подключаем эти части к Supabase.
Самостоятельная реализация
Без инструмента даже один тип уведомления в приложении Supabase потребует:
- Хранить токены устройств и регистрировать или удалять их при входе и выходе.
- Написать триггер Postgres на нужной таблице, например
AFTER INSERTилиAFTER UPDATE. - Вызвать Edge Function из триггера, обычно через
pg_netили webhook базы, потому что Postgres не может напрямую вызвать FCM и APNs. - Определить получателя внутри Function: одного пользователя, несколько через join или всех пользователей. SQL- или JS-логика различается для каждого типа уведомлений.
- Вызвать FCM и APNs, сформировать payload для платформы и обработать ошибки, истёкшие токены и повторные попытки.
- Повторить шаги 2–5 для каждого нового типа и каждой платформы.
Сами по себе эти шаги несложны. Нагрузка на сопровождение возникает, когда для каждого уведомления появляются новая Edge Function и новый запрос получателей. Зато всё остаётся в вашей инфраструктуре и миграциях.
Управляемый подход
Entrig заменяет шаги 2–5 настройкой. Уведомление состоит из трёх частей:
- Trigger: таблица и событие (
INSERT,UPDATE,DELETE), при необходимости с условием. - Users: способ поиска получателей — Direct (внешние ключи к одному пользователю), Indirect via Join Table (рассылка через таблицу связей) или Broadcast (все пользователи с возможным фильтром).
- Message: заголовок, текст и поля payload с
{{placeholders}}из строки, вызвавшей триггер.
При сохранении Entrig создаёт и устанавливает триггер и функцию Postgres в проекте Supabase. Собственную Edge Function писать и развёртывать не нужно. На клиенте SDK инициализируется API-ключом и регистрирует устройство для ID пользователя; доставку в FCM и APNs выполняет Entrig.
Что всё равно потребуется
Управляемый сервис не отменяет требований платформ. В любом случае необходимо:
- создать проект Firebase и JSON сервисного аккаунта для Android,
- получить ключ аутентификации APNs для нативной доставки iOS,
- включить push capability и background modes в iOS-проекте,
- запросить разрешение на уведомления и обработать нажатия и deeplinks,
- хранить в базе ID пользователя, совпадающий с ID регистрации устройства.
Самостоятельно или Entrig
| Самостоятельно | Entrig | |
|---|---|---|
| Новый тип уведомления | Новый SQL, запрос получателей, логика Edge Function и деплой | Настройка в панели, активна после сохранения |
| Установка триггера | Пишете и добавляете миграцией сами | Генерируется и устанавливается автоматически |
| Backend | Function или сервер, который нужно поддерживать | Собственный backend не нужен; Entrig выполняет доставку |
| Токены устройств | Хранение, обновление и очистка на вашей стороне | SDK регистрирует токены; отклонённые становятся невалидными |
| Повторы доставки | Логика FCM/APNs пишется вами | При временных ошибках отправка автоматически повторяется |
Руководства по платформам
Все руководства создают один групповой чат и три уведомления: вступление участника, новое сообщение и новая группа.