横断/運用基盤 / PWA
横断/運用基盤 / PWA
本ページは 2 段構成。上段が biz/CS 向け(ユーザー提示可)、下段(
## 🔧 実装詳細以降)が dev 向け。biz/CS がユーザーへ提示・転用してよいのは上段のみ。
概要
fincs サービスを PWA(Progressive Web App)として提供するための基盤レイヤ。Web ブラウザから fincs を「アプリのように」ホーム画面に追加して使えるようにし、起動高速化・オフライン対応の一部・通知受信などのアプリ的体験を提供する。
主な構成要素:
- PWA インストール対応: ホーム画面追加用のメタ情報(マニフェスト)・アイコン提供
- Service Worker: 静的アセットの事前キャッシュ・通知受信・OS バッジ更新を担当
- PWA 起動時の自動遷移: ログイン済みユーザーが PWA を起動した際、最後に訪問していた講座ページへ直接遷移する仕組み
- 配信キャッシュの無効化: リリース時に CDN(CloudFront)のキャッシュを全パス無効化し、最新版を即座に配信
- 更新検知 + リロード促進: 新バージョンがリリースされたタイミングで内部的に検知し、必要に応じて画面リロードを促す
- ストレージ容量管理: ブラウザの localStorage が満杯にならないよう、自動で不要なキャッシュ痕跡を削除する仕組み
主な利用想定は、スマートフォン・タブレットでアプリ的な体験で fincs を使う、iOS で通知機能を使うために PWA 化する、デプロイ後にユーザーが最新版を即座に受け取る、など。
iOS は PWA 化が前提: iOS Safari は標準では通知機能を使えない。ホーム画面追加で PWA として動作させた状態でのみ通知を受け取れる仕様。CS で「iOS で通知が来ない」相談時は PWA 化を案内する運用。
PWA 機能トグル: PWA 機能は内部の機能トグルで有効化/無効化可能。各環境で個別に制御している。
CloudFront キャッシュ無効化のコスト: リリース毎に全パスを無効化する仕組みのため、リリース頻度に応じて配信コストが発生する。配信頻度・コストのバランスは運用で判断。
iPhone PWA での画面更新の特殊事情: iPhone PWA では画面の自動更新処理が一部不安定であるため、内部的に通常の URL 履歴更新 + ページリロードを使う代替手段で対応している。
📝 レビュー観点:
- 目的: ホーム画面追加でアプリ風利用、オフライン対応の precache、デプロイ時のキャッシュ無効化
- 誰が使うか: 全ユーザー
- どこで使うか: 全画面、特に PWA インストール後のスタンドアロン起動
- 隣接機能との関係: 通知(
./notification.md)、SEO(./seo.md)、解析(./analytics.md)- CS 問い合わせで頻発する論点: 「ホーム画面追加できない」「アプリが起動しない」「再ログインを求められる」「最終訪問講座に直行したい」「iOS で通知が出ない」
- [本機能特有] PWA は ENABLE_PWA トグルで制御: 環境変数で無効化可能
- [本機能特有] iOS PWA 化必須で通知機能利用: PWA 未化の Safari は通知不可
- [本機能特有] CloudFront キャッシュ無効化はリリース毎: GitHub Actions で
/*無効化- [本機能特有] localStorage 3MiB 閾値: Firestore キャッシュ痕跡の自動削除
- [本機能特有] inject-manifest 戦略: Workbox + 自作 sw.ts
利用シナリオ
シナリオ 1: ホーム画面追加してアプリ風に利用
ユーザーがブラウザのメニューから「ホーム画面に追加」を選び、fincs を PWA としてインストール。インストール後はホーム画面アイコンから起動でき、ブラウザバー無しのアプリ風 UI(スタンドアロン表示)で利用できる。
シナリオ 2: PWA 起動時に最終訪問講座へ自動遷移
ログイン済みのユーザーが PWA を起動すると、トップ画面ではなく最後に訪問していた講座ページへ自動的に遷移する。継続学習の利用導線として、毎回トップから探し直す手間を減らす。
シナリオ 3: 新バージョンリリース後の最新版受信
運営側がリリースを行うと、配信キャッシュが全パス無効化され、ユーザー側では次回読み込み時に最新版が配信される。さらに、内部的にバージョンを定期確認し、新バージョンが出たことを検知するとユーザーに更新を促す動作も走る。
シナリオ 4: iOS で PWA 化して通知を受け取る
iOS ユーザーがホーム画面追加で PWA 化することで、通知機能の利用が可能になる。PWA 化していない iOS Safari では通知を受け取れない。
よくある失敗ケース
- PWA 未対応ブラウザでのインストール: 古いブラウザや一部の環境ではホーム画面追加機能自体が提供されていない。代替案内が必要
- localStorage 容量超過: ブラウザの localStorage が容量上限に達すると一部機能が動作不能になるケース。内部的に閾値到達時の自動削除で回避
- 更新検知後のリロード忘れ: 新バージョン検知後にリロードされないままだと古いバージョンを使い続けるケース。内部の促進処理で対応
- iOS 未 PWA 化での通知未受信: PWA 化していないと iOS では通知が届かない
権限別仕様
権限定義は ../user-roles.md 参照。
PWA は基盤機能のため、ユーザー権限軸での直接の操作は無い。全ユーザーが対象。
機能詳細(ふるまい)
PWA インストール
- ブラウザのメニュー「ホーム画面に追加」からインストール可能
- インストール用のメタ情報(マニフェスト)を提供
- アイコンは複数サイズ(64 / 192 / 512px)+ マスク対応の 192px を提供
- インストール後はスタンドアロン表示(ブラウザバー無し)で起動
Service Worker
- 静的アセットの事前キャッシュ(precache)でアプリ起動を高速化
- ナビゲーション(ページ遷移)の段階的キャッシュ
- フォントの長期キャッシュ
- 通知受信処理 + OS バッジ更新
- 事前キャッシュの対象サイズ上限あり(大容量メディアは対象外)
PWA 起動時の最終訪問講座への自動遷移
- ログイン済みかつトップ画面 / ログイン画面にいる場合、最後に訪問した講座ページへ自動遷移
- セッション内で初回起動時のみ実行(後続のページ遷移は通常通り)
- 機能トグルでの有効化制御
配信キャッシュ無効化(リリース時)
- リリース実行時に CDN(CloudFront)のキャッシュを全パス無効化
- ユーザーは次回読み込み時に最新版を取得できる
- 配信メタ情報の更新検知用ファイルには no-cache メタ情報を付与し、常に最新を取得する仕組み
更新検知 + リロード促進
- 内部的に定期的にバージョン情報を確認
- 新バージョンが検知された場合、ユーザーに更新を促し、必要に応じて画面リロードを実行
ストレージ容量管理
- ブラウザの localStorage 上限(5MiB)を超えると一部機能が動作不能になるリスクへの対応
- 容量が一定の閾値(3MiB)を超えた場合、内部キャッシュの痕跡を自動削除して空き容量を確保
iOS PWA の制約事項
- iOS Safari では PWA 化しないと通知機能を使えない
- PWA 起動状態でも、iOS 特有の動作制約に応じた個別対応が走る(通知の挙動・画面更新方法等)
- PWA 未化の iOS ユーザー向けには互換層経路(PushQuay)で通知を提供(
./notification.md参照)
📝 レビュー観点:
- 入力 → 処理 → 出力: PWA インストール → 起動 → SW 登録 → push 受信 → 通知表示
- エッジケース: 通知許可 denied、リダイレクト前後のセッション切れ、Service Worker 更新タイミング
- エラー表示: Service Worker 登録失敗時はサイレント
- [本機能特有] iPhone PWA で
reloadNuxtApp不安定:history.replaceState+window.location.reloadで代替
admin 操作
該当なし / 実装されていない
- PWA 関連の運営アドミン操作経路: 無し(全 FE 設定)
- CloudFront 手動 invalidate: GitHub Actions の手動起動(環境別 wrapper)
📝 レビュー観点:
- 緊急時の手動 invalidate 経路の運用ガイド
品質 / 約束事項
- 応答性: PWA インストール即時、Service Worker 更新は次回起動時
- 信頼性: precache + ナビゲーション fallback で網羅、CloudFront invalidate でリリース反映
- 制限値:
- Service Worker precache 上限: 6 MB(
maximumFileSizeToCacheInBytes) - フォントキャッシュ: 30 件上限 + 1 年期限
- localStorage 閾値: 3 MiB(5 MiB 上限の安全マージン)
- Firestore IndexedDB キャッシュ: 40 MB
- Firestore キャッシュ再初期化周期: 24 時間
- Service Worker precache 上限: 6 MB(
- データ保持: PWA 設定は端末ローカル
📝 レビュー観点:
- [本機能特有] CloudFront 無効化のコスト: リリース毎の
/*無効化
変更履歴(リリースノート候補)
v2.29.2: 2026-05-04(PSD 初版)
- [PSD 追加] 本ドキュメント初版作成。v2.29.2 時点の実装を起こし。機能追加・変更は含まない
📝 レビュー観点:
- 過去の主要変更(@vite-pwa/nuxt 導入 / inject-manifest 戦略移行 / 起動リダイレクト追加 等)
関連ドキュメント
- 権限定義:
../user-roles.md - 用語辞書:
../terminology.md - 関連 PSD:
./notification.md— 通知基盤./seo.md— SEO./analytics.md— 解析・モニタリング