「電波がなくてもアプリが動く」は、当たり前のようで難しい。一度、週間予報が2日分しか表示されないバグを出してから、キャッシュ設計を見直しました。天気アプリは通勤中の地下鉄や山間部など、ネットワークが不安定な環境で使われることが多いため、カサいる?はオフラインファースト設計を採用しています。

キャッシュの3層構造

1. インメモリキャッシュ(TTL: 5分)

時間帯プリセット切り替えなど、同一座標への連続リクエストをインメモリで吸収します。座標キーは小数点4桁で丸めて使用します。

2. ローカルキャッシュ(TTL: 3時間)

SharedPreferencesに傘判定・服装アドバイス・週間予報をそれぞれ別キーで保存します。傘判定と週間予報は別々のキャッシュキーを使用します。これは過去に共通キーを使って「週間予報が2日分しか表示されない」バグが発生した教訓からの設計です。

3. サーバーキャッシュ(TTL: 1時間)

Supabase Edge FunctionsがOpen-Meteo APIのレスポンスをジオインデックス付きでキャッシュします。近くのユーザー同士が同じキャッシュを共有するため、API呼び出しを大幅に削減します。

オフライン時の動作

ネットワーク接続がない場合は、SharedPreferencesのキャッシュデータを表示します。画面には「オフライン」インジケーターが表示され、ユーザーはデータが最新でない可能性があることを認識できます。ローカル通知はオフラインでも引き続き動作します。

バックグラウンド同期

Workmanagerプラグインにより、4時間ごとにバックグラウンドで天気データを更新します。アプリを開いていなくても、次に開いたときには比較的新しいデータが表示されます。

クラウド同期

認証済みユーザーの設定データはSupabaseにクラウド同期されます。機種変更時や複数端末間での設定共有がシームレスに行えます。サインイン時に自動的に同期がトリガーされるため、ユーザーが意識する必要はありません。