【MAUI × Supabase × Render】Android端末の位置情報を定期送信する常駐アプリを作ってみた

はじめに
個人用途で Android端末の位置情報を定期的に取得し、サーバーへ送信する常駐アプリ を作っています。
子供の見守りに毎月課金するよりスマホもたせるほうがいいかなとー
*技術スタックは以下です。
クライアント:.NET MAUI(Androidのみ)
APIサーバー:Node.js(Render)
DB:Supabase(PostgreSQL)
この記事では、
なぜこの構成にしたか
全体アーキテクチャ
MAUI側の実装方針
サーバー/DB設計の考え方
ハマりどころ
をまとめます。
作ったものの概要
やりたいこと
Android端末で
位置情報(緯度・経度)を 1分~数分おきに取得
アプリが前面/背面でも 自動送信
サーバー側で
端末ごとに 送信間隔を制御
DBに履歴として保存
全体構成
[ Android端末 (MAUI) ]
├ 位置情報取得
├ 送信タイマー制御
└ HTTP POST
↓
[ Node.js API (Render) ]
├ 認証(UUID)
├ 送信可否判定
└ DB登録
↓
[ Supabase PostgreSQL ]
├ positions(位置履歴)
└ device_instructions(端末制御)
この構成にした理由
要素 理由
MAUI C#でAndroid常駐アプリを書きたかった
Render 無料枠でAPIを立てられる
Supabase PostgreSQL+管理UIが楽
最初Renderに保存もしてたんですけどある日DBが消えてた(無料枠の仕様)
MAUI(Android)側の設計
基本方針
タイマー常駐型
端末側は「指示に従うだけ」
送信間隔はサーバー主導
位置送信ループ(イメージ)
async Task StartScheduledLoopAsync()
{
while (true)
{
await Task.Delay(TimeSpan.FromSeconds(10));
if (DateTime.Now >= NextRequestTime)
{
await SendLocationAsync();
UpdateNextRequestTime();
}
}
}
実装上のポイント
Task.Run で拡張可能な設計
サーバー(Node.js / Render)
APIの役割
UUIDで端末を識別
DBに保存
次回送信時刻を返す
POST /api/location
{
uuid: "...",
lat: 35.xxxx,
lon: 139.xxxx
}
レスポンス例:
{
"interval_seconds": 60,
"next_request_time": "2026-01-08T15:30:00"
}
Supabase(PostgreSQL)設計
positions(位置履歴)
カラム 型
id UUID
device_uuid UUID
latitude numeric
longitude numeric
created_at timestamp
device_instructions(端末制御)
カラム 説明
device_uuid 端末識別
interval_seconds 送信間隔
next_request_time 次回送信
location_request_time 位置取得指示
👉 「いつ送るか」はサーバーが決めるのがポイント
ハマりどころ・注意点
Androidの制約
バックグラウンド制限が厳しい
バッテリー最適化の除外が必要
セキュリティ
野良配布前提だが
UUID認証
APIキー直書き回避
は最低限必要
通信コスト
Render / Supabase 無料枠でも
1分間隔なら実用範囲
今後やりたいこと
逆ジオコーディング(住所変換)
Supabase Realtime 連携
管理画面(Web)追加
Android Foreground Service 対応
おわりに
MAUIは「業務アプリ向け」のイメージが強いですが、
個人用途のAndroid常駐アプリにも十分使えます。
同じようなことをやりたい人の参考になればうれしいです 🙌