概要
GPSを使って歩いた軌跡をマップにトラッキングするアプリを以前作りました
改善点があり、バックグラウンドの状態では記録できないことやロック画面の状態だと正しく記録されないということがありました
なにかしら改善をしたいなと考えてGeminiに聞いてみたところGCPを使うことやFirestoreを使って座標データを記録すると保存できますという回答をもらいました
たしかに、話には聞いたことはありましたがあまり詳しくないなと感じたのでこの際調べてみることにしました
本題
Geminiが提案してきた利用方法としては以下の内容でした
- 移動中はローカル(SwiftData / SQLite)に即時保存
GPSが検知した緯度・経度・タイムスタンプは、まずはiPhone内の軽量なローカルDB(SwiftData)に保存します。これならオフラインでも100% ログが残ります。- 一定周期、または移動終了時に「バルク(一括)送信
「5分ごと」「100件溜まったら」「移動が止まったら」などのトリガーで、ローカルのデータを配列としてまとめてバックエンド(FastAPIやCloud Functions)に一度のHTTPリクエストで送信(バルクインサート)します。
「一定周期、または移動終了時に「バルク(一括)送信」の部分でFirestoreというものを使うみたいです
次にFirestoreについて聞いた結果が以下になります
Firestore(正式名称:Cloud Firestore)は、Googleが提供するクラウドプラットフォーム(GCP / Firebase)のNoSQLデータベースです。
なるほどAWSで言うところのDynamoDBということですね
行と列で管理しているものではなく、ドキュメントとコレクションというもので管理しているようです
-
ドキュメント: 実際のデータが入る、JSONに似た形式のオブジェクトです(例:ユーザー情報、1回分の移動ログ)
-
コレクション: ドキュメントをまとめる「フォルダ」のようなものです
trips (コレクション:移動データのフォルダ)
┗ trip_20260606_001 (ドキュメント:1回目の移動データ)
┣ user_id: "user_9999"
┣ date: "2026-06-06"
┗ points: [ {lat: 35.65, lng: 139.74}, ... ]
上記のような形で階層(Arrayのようなイメージ)でデータを保存することができるようです
そのほかに挙げられた特徴としてはいくつかありました
① リアルタイム同期機能
データベースの値が更新されると、アプリ側に「データが変更された」という通知が自動で飛び、画面を即座に書き換えることができます(Webソケットなどの複雑なリアルタイム通信の仕組みを自分で実装する必要がありません)
② 強力なオフラインサポート
iPhoneアプリなど向けに最初から「オフライン対応」の機能が組み込まれています
地下鉄などで電波が切れている間はアプリ内のローカルにデータを保存し、電波が復帰した瞬間に自動でFirestoreへデータを同期してくれます
③ 自動スケーリングと高い可用性
ユーザーが1人でも、世界中で100万人に増えても、設定変更なしで自動的にサーバーがスケールしてくれます
- 料金システム
Firestoreは「サーバー1台あたり月額いくら」という固定費ではなく、「どれだけデータベースを読み書きしたか(リクエスト回数)」の完全従量課金制です
また無料枠としても以下のように用意されており、非常に個人開発に向いていそうでした
| 操作 | 1日あたりの無料枠 |
|---|---|
| データの書き込み(Documents written) | 20,000 回 / 日 |
| データの読み込み(Documents read) | 50,000 回 / 日 |
| データの削除(Documents deleted) | 20,000 回 / 日 |
| 総ストレージ容量 | 1 GiB まで |
Pythonコードなどからの利用方法・登録方法についてはまた別途整理してまとめ上げたいと思います
ところで
調べている中でなんか聞いたことがあるなと思ったのですが、「Firebase」ってあったなと思いました
Firebase(ファイアベース)とは、Googleが提供している「モバイルアプリやWebアプリ開発のための統合プラットフォーム(開発基盤)」です。
つまりFirebaseというプラットフォームの一部にFirestoreというNoSQLが存在しているという関係性のようです
おわりに
ということで久しぶりの座学会でした
普段はAWSを使う機会が多いのでGCP製品(Firebase)を把握しきれていないですが、遅れを取らないように継続してキャッチアップしていきたいと思います