Реализация Supabase в мобильном приложении
Вы интегрируете сторонние сервисы в мобильное приложение, и вдруг осознаёте: Firebase — это vendor lock-in с проприетарной NoSQL-базой. Переход на Supabase даёт полноценный PostgreSQL с SQL, реляционными связями и Row Level Security. Но без правильной настройки вы рискуете: сессии теряются в фоне, Realtime не приходит, а анонимный ключ открывает доступ к данным. Ошибки в конфигурации могут стоить до 40% времени на отладку на production. Мы реализуем интеграцию Supabase под ключ за 3–5 недель. Оценим ваш проект бесплатно — просто напишите нам. За 5 лет работы мы выполнили 20+ проектов с Supabase, включая высоконагруженные приложения для iOS и Android. Гарантируем соответствие App Store Review Guidelines (Section 5.1) и Google Play Store политикам.
Почему Supabase лучше Firebase для мобильных приложений?
| Критерий | Supabase | Firebase |
|---|---|---|
| Тип БД | PostgreSQL (реляционная) | NoSQL (Firestore) |
| SQL | Полноценный SQL | Ограниченные запросы |
| Self-hosted | Да (open-source) | Нет |
| Realtime | WebSocket (Phoenix Channels) | Firestore realtime |
| Цена | Бесплатный tier + PAYG | Бесплатный tier + PAYG |
| Lock-in | Нет | Высокий |
Supabase выигрывает при работе с реляционными данными: внешние ключи, JOIN, транзакции. Для приложений с аналитикой, финансами или сложными отчётами Supabase в 2–3 раза дешевле Firebase по затратам на запросы. Кроме того, PostgreSQL — зрелая СУБД с 30+ годами развития, что обеспечивает предсказуемую производительность.
Инициализация в React Native
import { createClient } from '@supabase/supabase-js'; import AsyncStorage from '@react-native-async-storage/async-storage'; import 'react-native-url-polyfill/auto'; // обязательно для RN export const supabase = createClient( process.env.SUPABASE_URL!, process.env.SUPABASE_ANON_KEY!, { auth: { storage: AsyncStorage, autoRefreshToken: true, persistSession: true, detectSessionInUrl: false, }, } ); react-native-url-polyfill — обязателен: Supabase использует URL API, которого нет в Hermes/JSC без полифила. Без него — тихая ошибка при первом запросе.
Как защитить данные на клиенте с помощью RLS?
Row Level Security — политики доступа на уровне PostgreSQL. Даже если клиент имеет anon key — без подходящей политики данные недоступны. Важно: RLS работает на уровне сервера, не обходится при прямом SQL-запросе. Это принципиально для mobile, где anon key находится в коде приложения и может быть извлечён reverse engineering'ом. PostgreSQL RLS Documentation
-- Включаем RLS для таблицы ALTER TABLE posts ENABLE ROW LEVEL SECURITY; -- Пользователь видит только свои посты CREATE POLICY "user_can_read_own_posts" ON posts FOR SELECT USING (auth.uid() = user_id); -- Пользователь создаёт только свои посты CREATE POLICY "user_can_insert_own_posts" ON posts FOR INSERT WITH CHECK (auth.uid() = user_id); Аутентификация и AppState
Supabase GoTrue рефрешит JWT автоматически. Но на iOS при длительном нахождении в фоне refresh-запрос может не выполниться. При возврате в foreground нужно явно проверить сессию:
useEffect(() => { const subscription = AppState.addEventListener('change', async (nextState) => { if (nextState === 'active') { await supabase.auth.getSession(); } }); const { data: authListener } = supabase.auth.onAuthStateChange((event, session) => { if (event === 'TOKEN_REFRESHED') { updateGlobalSession(session); } if (event === 'SIGNED_OUT') { clearLocalData(); navigateToLogin(); } }); return () => { subscription.remove(); authListener.subscription.unsubscribe(); }; }, []); Загрузка файлов в Storage
import * as FileSystem from 'expo-file-system'; const uploadFile = async (localUri: string, path: string) => { const base64 = await FileSystem.readAsStringAsync(localUri, { encoding: FileSystem.EncodingType.Base64, }); const { data, error } = await supabase.storage .from('avatars') .upload(path, decode(base64), { contentType: 'image/jpeg', upsert: true, }); if (error) throw error; const { data: { publicUrl } } = supabase.storage .from('avatars') .getPublicUrl(path); return publicUrl; }; decode из пакета base64-arraybuffer. Supabase Storage принимает ArrayBuffer, не строку. На больших файлах используйте FormData с fetch напрямую — base64 увеличивает размер на 33%.
Что важно знать о производительности Supabase на мобильных устройствах?
Realtime-подписки через WebSocket потребляют трафик и батарею. На Android при свернутом приложении WebSocket может отключиться — используйте FCM для «толстых» уведомлений. Оптимальная стратегия: подписываться только на активные экраны, отписываться при переходе в фон. Это снижает нагрузку на 50%.
Платформенные клиенты: supabase-swift и supabase-kt
Для нативных приложений Supabase предлагает официальные SDK. На iOS используем supabase-swift (SwiftUI + Combine), на Android — supabase-kt (Kotlin Coroutines). Оба поддерживают все функции: Auth, Realtime, Storage, RLS. В React Native и Flutter применяем supabase-js.
Типичные задачи интеграции и оценка времени
| Задача | Среднее время |
|---|---|
| Настройка Auth (email + OAuth) | 3–5 дней |
| Проектирование RLS политик | 2–4 дня |
| Интеграция Realtime | 2–3 дня |
| Настройка Storage с bucket-правилами | 1–2 дня |
| Миграция данных с Firebase | 5–7 дней |
Частые ошибки при интеграции Supabase
- Не включать RLS на таблицах. Анонимный ключ получает полный доступ. Всегда явно включайте RLS после создания таблицы.
- Хранить сессию в непостоянном хранилище. При сворачивании приложения токен теряется. Используйте AsyncStorage (React Native) или UserDefaults (native).
- Игнорировать
react-native-url-polyfill. Приводит к ошибке при первом запросе. Установите пакет и импортируйте в корне. - Не обрабатывать AppState. На iOS сессия может не обновиться после долгого фона. Добавьте обработчик foreground.
Что входит в работу
- Аудит текущей архитектуры и схемы БД
- Проектирование политик RLS и миграций
- Настройка Auth (email, OAuth, magic link) с обработкой AppState
- Интеграция Realtime подписок для мгновенных обновлений
- Конфигурация Storage с bucket-политиками
- Написание TypeScript-типов из схемы БД (supabase gen types)
- Сборка и публикация в TestFlight / Google Play Console
- Документация по развёртыванию и эксплуатации
Процесс работы
- Аналитика — ревью вашего кода, схемы данных, требований
- Проектирование — RLS политики, индексы, репликация
- Реализация — интеграция SDK, миграции, тесты
- Тестирование — нагрузочное тестирование, проверка безопасности
- Деплой — настройка CI/CD, мониторинг в Supabase Dashboard
Сроки и стоимость
Ориентировочные сроки: от 3 до 7 недель в зависимости от сложности. Конкретная стоимость рассчитывается индивидуально после аудита. Получите консультацию по интеграции Supabase — свяжитесь с нами, и мы проведем бесплатный аудит вашей архитектуры.







