Интеграция Firebase Realtime Database в мобильное приложение

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.
Разработка и поддержка любых видов мобильных приложений:
Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

Это лишь некоторые из типы мобильных приложений, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента.

Предлагаемые услуги
Показано 1 из 1 услугВсе 1735 услуг
Интеграция Firebase Realtime Database в мобильное приложение
Средняя
от 1 рабочего дня до 3 рабочих дней
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    756
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    624
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1052
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    947
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    862
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    445

Интеграция Firebase Realtime Database в мобильное приложение

Firebase Realtime Database (RTDB) — JSON-дерево с WebSocket-синхронизацией. Не реляционная БД, не документная БД в классическом смысле. Ключевая фича — офлайн-персистентность и real-time синхронизация из коробки. Но неправильная структура данных в RTDB превращает эти преимущества в проблему: подписка на узел enablePersistence при глубоком вложении затянет весь поддиатри в память устройства.

Структура данных: денормализация обязательна

В RTDB нет JOIN. Если хотите получить посты пользователя — не вкладывайте посты внутрь пользователя. Денормализуйте:

{
  "users": {
    "uid123": { "name": "Иван", "email": "ivan@..." }
  },
  "posts": {
    "postId1": { "userId": "uid123", "text": "...", "createdAt": 1700000000 }
  },
  "userPosts": {
    "uid123": { "postId1": true, "postId2": true }
  }
}

userPosts — обратный индекс для получения постов конкретного пользователя без сканирования всего узла posts. Это стандартный паттерн для RTDB.

Подписки в React Native

import database from '@react-native-firebase/database';

useEffect(() => {
  const ref = database().ref(`/userPosts/${userId}`);

  // value: полный снапшот при каждом изменении
  const onValue = ref.on('value', snapshot => {
    const postIds = Object.keys(snapshot.val() ?? {});
    setPostIds(postIds);
  });

  // child_added: только новые элементы
  const onChildAdded = ref.on('child_added', snapshot => {
    setPostIds(prev => [...prev, snapshot.key!]);
  });

  return () => {
    ref.off('value', onValue);
    ref.off('child_added', onChildAdded);
  };
}, [userId]);

Критично: всегда вызывайте ref.off() при размонтировании. on() без off() — memory leak: слушатель живёт вечно, перерендеривает компонент который уже удалён. В продакшне это крэш с Can't perform a React state update on an unmounted component.

Офлайн-персистентность

// index.js, до любых обращений к database()
import database from '@react-native-firebase/database';
database().setPersistenceEnabled(true);
database().setPersistenceCacheSizeBytes(10 * 1024 * 1024); // 10 MB

setPersistenceEnabled(true) включает SQLite-кэш на устройстве. При офлайне приложение читает из кэша. При восстановлении сети — синхронизирует изменения. Вызывать только один раз при инициализации, до первого подключения к БД.

keepSynced(true) на конкретном узле — предзагружает данные и держит в кэше, даже если нет активных слушателей:

database().ref(`/userPosts/${userId}`).keepSynced(true);

Осторожно: не применяйте keepSynced к большим узлам — RTDB скачает всё дерево.

Правила безопасности

Дефолтные правила RTDB — либо всем читать/писать, либо никому. Обязательно настраиваем перед продакшном:

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    },
    "posts": {
      "$postId": {
        ".read": "auth != null",
        ".write": "auth != null && newData.child('userId').val() === auth.uid",
        ".validate": "newData.hasChildren(['userId', 'text', 'createdAt'])"
      }
    }
  }
}

.validate — проверяет структуру данных перед записью. Без валидации клиент может записать произвольный JSON.

Транзакции для конкурентного обновления

Лайки, счётчики, баланс — любой конкурентный инкремент:

const likeRef = database().ref(`/posts/${postId}/likes`);
await likeRef.transaction(currentLikes => (currentLikes ?? 0) + 1);

transaction() атомарно читает и записывает. Если между read и write другой клиент изменил значение — транзакция повторяется автоматически (до 25 раз). Для лайков это единственно правильный подход — set(currentLikes + 1) даст race condition при одновременных нажатиях.

RTDB vs Firestore: когда что выбирать

RTDB лучше для: real-time чатов, presence/статусы онлайн, игровые leaderboard, потоки событий. Firestore лучше для: сложные запросы, коллекции документов, масштабирование > 1M пользователей.

Стоимость RTDB: $5/ГБ хранилища + $1/ГБ трафика. При высокой частоте обновлений (чат, real-time) RTDB дешевле Firestore за счёт отсутствия поперечного billing по операциям read/write.

Оценка

RTDB с офлайн-персистентностью, правилами безопасности и real-time подписками: 2–3 недели.