ReachTrail は、基準地点から外食先までの距離と難易度を記録する Flutter MVP です。 Web は MVP として問題なく利用できる状態です。 macOS はダウンロードして使える状態です。 Android はテスターを募っており、公開準備中です。
現在の公開先:
- Web:
https://app.reachtrail.riumu.net - API:
https://api.reachtrail.riumu.net - macOS 配布:
https://download.reachtrail.riumu.net - Android: テスターを募集中
- 基準地点を 1 件登録・修正・削除
- 基準地点は Yahoo 検索候補、住所メモ、地図上の手動選択で設定
- 飲食店検索
- 候補選択または手入力で店舗登録
- 店舗が見つからない場合の建物名・住所ベース補完
- OpenStreetMap ベースの簡易マップで候補位置を比較
- レーダー風 UI で基準地点から見た方向と距離を把握
- Map タブで現在の基準地点に紐づく登録地点を確認
- Google ログイン
- 階数ラベルと数値階の補完
- 直線距離、任意の実移動距離、縦移動情報の記録
- 外食記録保存・編集・削除
- 基準地点削除時は、紐づく登録地点と記録も削除
- 実距離と難易度スコアの表示
- 自己ベストと履歴一覧
次回以降の Web 更新では、テスターからのフィードバックを受けながら次の改善を反映予定です。
- 記録モーダルで、保存に必要な項目を明確化
- 候補から記録する場合の入力コストを削減
- メニュー、価格、支払い方法、メモなどの任意項目を後から追記しやすい構成に整理
- ランキング対象をユーザーではなくお店として扱う共有ビューを追加
- お店単位の集計を、レーダー形式と OpenStreetMap を組み合わせた共有地図で可視化
- 共有データ基盤へ接続する前段階として、現在の記録データをお店単位に集約して表示
- UI: Flutter
- 保存:
shared_preferences - 認証: Google ログイン
- 検索:
PLACE_SEARCH_PROVIDERに応じて切替 mock: 同梱サンプルデータを検索yahoo: Yahoo ローカル検索 API を使用- 基準地点からの近傍検索は「片道徒歩 45 分」を円形半径に換算して絞り込み
- 近傍検索で 0 件なら、Yahoo は距離制限なしで広域再検索する
- 同一店の候補が重複した場合は、階数情報を持つ候補を優先する
- 店舗候補が見つからない場合は、建物名と階数候補を使って手入力登録へ寄せる
設定ファイルは 2 種類あり、アプリにバンドルされるのは .vars だけです。
| ファイル | バンドル | 用途 |
|---|---|---|
assets/config/.vars |
される | リリースを含む全ビルドの非機密設定 |
assets/config/.env |
されない | ローカル開発時の控え(実行時には読まれない) |
pubspec.yaml の asset 一覧に載っている唯一の設定ファイルで、リリース成果物
(.aab / .ipa)の中にそのまま入ります。したがって API キーなどの機密情報を
書いてはいけません。Yahoo! ローカルサーチのキーは API プロキシ側にのみ置きます。
cp assets/config/.vars.example assets/config/.varsPLACE_SEARCH_PROVIDER=yahoo
YAHOO_PROXY_BASE_URL=https://api.reachtrail.riumu.net/yahoo/localSearch
API_BASE_URL=https://api.reachtrail.riumu.net
GOOGLE_WEB_CLIENT_ID=...apps.googleusercontent.com
GOOGLE_MACOS_CLIENT_ID=...apps.googleusercontent.comGoogle の OAuth クライアント ID は公開前提の識別子なので、ここに置いて問題ありません。
pubspec.yaml の asset 一覧に載せていないため、実行時に読み込まれることはなく、
リリース成果物にも入りません。ローカル開発の値を手元に控えておくためのファイルです。
cp assets/config/.env.example assets/config/.env開発中に Yahoo API を直接叩きたい場合は、キーをコマンドラインから渡します。
このパスはデバッグビルド(kDebugMode)でのみ有効です。
flutter run --dart-define=YAHOO_API_KEY=<your key>リリースビルドでは、YAHOO_PROXY_BASE_URL が未設定だと店舗検索はエラーになります。
クライアント側のキーで Yahoo を直接呼ぶことは、リリースでは行いません。
非 web では .vars -> --dart-define の順に解決します。
web はアセット設定を読まず、--dart-define を使います。
設定変更後は、アプリを再起動すると反映します。
起動時の読み込みに失敗した場合は、エラー画面の「再試行」から読み込み直せます。
Google ログイン設定や API_BASE_URL を変えた場合は、flutter run を一度終了してから起動し直してください。
flutter pub get
flutter runMock 検索を明示する場合:
flutter run --dart-define=PLACE_SEARCH_PROVIDER=mockYahoo API を使う場合:
flutter run \
--dart-define=PLACE_SEARCH_PROVIDER=yahoo \
--dart-define=YAHOO_API_KEY=YOUR_API_KEY \
--dart-define=YAHOO_PROXY_BASE_URL=https://api.reachtrail.riumu.net/yahoo/localSearch \
--dart-define=API_BASE_URL=https://api.reachtrail.riumu.net \
--dart-define=GOOGLE_WEB_CLIENT_ID=823224608668-trbi6qgpsmsn2o8qika1bbf8o30ihqpd.apps.googleusercontent.com \
--dart-define=GOOGLE_MACOS_CLIENT_ID=823224608668-9blagvtvvuoa728q195ma5jlpeq1308a.apps.googleusercontent.comweb のローカル確認例:
flutter run -d web-server \
--web-hostname localhost \
--web-port 3000 \
--dart-define=PLACE_SEARCH_PROVIDER=yahoo \
--dart-define=YAHOO_PROXY_BASE_URL=https://api.reachtrail.riumu.net/yahoo/localSearch \
--dart-define=API_BASE_URL=https://api.reachtrail.riumu.net \
--dart-define=GOOGLE_WEB_CLIENT_ID=823224608668-trbi6qgpsmsn2o8qika1bbf8o30ihqpd.apps.googleusercontent.com \
--dart-define=GOOGLE_MACOS_CLIENT_ID=823224608668-9blagvtvvuoa728q195ma5jlpeq1308a.apps.googleusercontent.commacOS のローカル確認例:
flutter run -d macos \
--dart-define=PLACE_SEARCH_PROVIDER=yahoo \
--dart-define=YAHOO_PROXY_BASE_URL=https://api.reachtrail.riumu.net/yahoo/localSearch \
--dart-define=API_BASE_URL=https://api.reachtrail.riumu.net \
--dart-define=GOOGLE_WEB_CLIENT_ID=823224608668-trbi6qgpsmsn2o8qika1bbf8o30ihqpd.apps.googleusercontent.com \
--dart-define=GOOGLE_MACOS_CLIENT_ID=823224608668-9blagvtvvuoa728q195ma5jlpeq1308a.apps.googleusercontent.commacOS で Connection refused ... http://localhost:8080/auth/google が出る場合は、API_BASE_URL が未設定です。
assets/config/.env または --dart-define で https://api.reachtrail.riumu.net を指定し、flutter run を終了してから再起動してください。
現時点では web、Android、macOS で Google ログインを有効化しています。
メール認証は今後対応予定です。
- Web client ID:
823224608668-trbi6qgpsmsn2o8qika1bbf8o30ihqpd.apps.googleusercontent.com - Android は上記の Web client ID を
serverClientIdとして利用します。 - macOS client ID:
823224608668-9blagvtvvuoa728q195ma5jlpeq1308a.apps.googleusercontent.com
google-services.json は不要です。
web では Google Cloud 側の Authorized JavaScript origins に
https://app.reachtrail.riumu.net を登録済みである必要があります。
ローカル確認も行う場合は http://localhost:3000 も追加します。
- Yahoo API は公式レスポンスの
Property.PlaceInfo.FloorName、Property.Building.Name、Property.Building.Floor、Property.Genre[].Nameを優先して解釈します。 - 近傍検索の円半径は、徒歩速度
5.0 km/hと片道45 分を前提に3.75kmで計算しています。 - Yahoo API から建物名や階数が安定取得できない場合でも、手入力で記録を完結できます。
- 基準地点は検索候補がない住所でも、住所メモと地図上の位置選択で登録できます。
- 店舗名で見つからない場合は、登録画面から建物名や住所で建物候補を検索し、建物名・座標・階数候補を引き継いで記録できます。
- 基準地点側は
拠点フロアと出入口フロア、店舗側は目的フロアと入口フロアを任意で持てます。6Fは 6 階、B1や地下2階は地下階として扱います。 - エレベータ有無と
エレベータ乗車回数は任意入力で、詳細に入れるほど記録精度が上がります。 - 保存済み記録は履歴画面から編集して再保存できます。
- 保存済み記録は履歴画面や Map タブから削除できます。
- 難易度スコアは
scoreVersion付きで保存しており、将来の再計算に備えています。 - MVP では直線距離を自動計算し、実際に近い移動距離は任意入力で補完できます。