Адаптер базы данных 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"
}
}
}
}