Skip to Content

Адаптер базы данных Firebase Realtime

Пакет tracelet_firebase предоставляет простой вставной адаптер для синхронизации фоновых местоположений непосредственно с базой данных Firebase Realtime (RTDB) — на 100 % без сервера, без необходимости развертывания облачных функций.

Установка

Добавьте адаптер в pubspec.yaml:

flutter pub add tracelet_firebase

Этот адаптер использует firebase_core и firebase_auth. Вы должны настроить свое приложение Flutter для Firebase (с помощью flutterfire configure) и создать базу данных реального времени в консоли Firebase перед ее использованием.

Как это работает

В отличие от интеграции Firestore SDK, этот адаптер не открывает отдельный путь записи. Он подключается к экономичному собственному механизму синхронизации HTTP Tracelet: buildHttpConfig создает HttpConfig, указывающий на конечную точку REST вашей RTDB (<database>/<path>.json), аутентифицированную с помощью токена Firebase Auth ID в качестве параметра запроса ?auth=.

Поскольку синхронизация выполняется на собственном движке, пакеты загружаются с экспоненциальной отсрочкой и постановкой в ​​очередь в автономном режиме даже при принудительном закрытии приложения. Когда срок действия токена истекает и RTDB возвращает 401, configureTokenRefresh прозрачно обновляет токен Firebase ID — на переднем плане и в изолированном фоновом режиме без заголовка — и повторяет попытку.

Настройка и конфигурация

Инициализировать Firebase

Инициализируйте Firebase в main.dart перед вызовом Tracelet:

import 'package:firebase_core/firebase_core.dart'; import 'firebase_options.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp( options: DefaultFirebaseOptions.currentPlatform, ); runApp(const MyApp()); }

Настройте обновление токена и создайте конфигурацию HTTP

Вызовите configureTokenRefresh() один раз, затем создайте HttpConfig для вашего пути RTDB и передайте его Tracelet.ready:

import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_auth/firebase_auth.dart'; import 'package:tracelet_firebase/tracelet_firebase.dart'; import 'package:tracelet/tracelet.dart'; // 1. Your Realtime Database URL (from FirebaseOptions). final databaseUrl = Firebase.app().options.databaseURL; // 2. Keep the Firebase ID token fresh in the background (resolves 401s). await TraceletFirebase.configureTokenRefresh(); // 3. Get the signed-in user's id for a per-user write path. final uid = FirebaseAuth.instance.currentUser?.uid ?? 'anonymous_device'; // 4. Build the native HTTP config for RTDB. final httpConfig = await TraceletFirebase.buildHttpConfig( databaseUrl: databaseUrl!, // e.g. https://my-project-default-rtdb.firebaseio.com path: 'locations/$uid', // secure this path in your RTDB rules // autoSync: true, batchSync: true, maxBatchSize: 250 are the defaults ); // 5. Start Tracelet with the adapter's HTTP config. await Tracelet.ready(Config( geo: const GeoConfig(distanceFilter: 50), http: httpConfig, )); await Tracelet.start();

Пользователь должен пройти аутентификацию, чтобы запись прошла успешно в соответствии с защищенными правилами. Если у вас еще нет реального процесса входа в систему, FirebaseAuth.instance.signInAnonymously() достаточно, чтобы получить uid во время тестирования.

Прикрепление пользовательских метаданных

Чтобы пометить каждое местоположение бизнес-данными (например, order_id или trip_id), используйте setRouteContext() — он проходит с каждым местоположением через очередь SQLite и включается в полезную нагрузку RTDB:

await Tracelet.setRouteContext(RouteContext( taskId: 'order_123', custom: {'trip_id': 'trip_456'}, ));

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

Защитите свою базу данных реального времени, чтобы аутентифицированные пользователи могли писать только по своему собственному пути:

{ "rules": { "locations": { "$uid": { ".read": "auth != null && auth.uid === $uid", ".write": "auth != null && auth.uid === $uid" } } } }