Firebase リアルタイム データベース アダプター
tracelet_firebase パッケージは、バックグラウンドの場所を Firebase Realtime Database (RTDB) に直接同期するためのシームレスなドロップイン アダプターを提供します。これは 100% サーバーレスであり、Cloud Functions をデプロイする必要はありません。
インストール
flutter pub add tracelet_firebaseこのアダプターは firebase_core と firebase_auth を使用します。 Flutter アプリを Firebase 用に構成し (flutterfire configure を使用)、使用する前に Firebase コンソールで リアルタイム データベースを作成する必要があります。
仕組み
Firestore SDK 統合とは異なり、このアダプターは別の書き込みパスを開きません。これは、Tracelet のバッテリー効率の高い ネイティブ HTTP 同期エンジンに接続されます。buildHttpConfig は、RTDB の REST エンドポイント (<database>/<path>.json) を指す HttpConfig を生成し、?auth= クエリ パラメーターとして Firebase Auth ID トークンで認証されます。
同期はネイティブ エンジンで実行されるため、アプリが強制終了された場合でも、指数バックオフとオフライン キューを使用してバッチがアップロードされます。トークンの有効期限が切れ、RTDB が 401 を返すと、configureTokenRefresh は Firebase ID トークンを透過的に更新し(フォアグラウンド * および* ヘッドレス バックグラウンド分離で)、再試行します。
セットアップと構成
Firebaseを初期化する
Tracelet を呼び出す前に、main.dart で Firebase を初期化します。
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() を 1 回呼び出してから、RTDB パスの HttpConfig を構築し、それを 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();安全なルールに照らして書き込みを成功させるには、ユーザーが認証される必要があります。実際のサインイン フローがまだない場合は、テスト中に uid を取得するには FirebaseAuth.instance.signInAnonymously() で十分です。
カスタムメタデータの添付
すべての場所にビジネス データ (order_id または trip_id など) をタグ付けするには、setRouteContext() を使用します。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"
}
}
}
}