問題
PWA(ホーム画面追加)やショートカットから起動すると、start_url: "/" ではなく前回表示していたURL(例: /omikuji)がそのまま復元されてしまい、おみくじ画面が残った状態で起動する。
原因分析
web/nuxt.config.js:137-138 で manifest は start_url: "/" / display: "standalone" を指定しているが、クライアント側に起動時の画面リセット処理がない。standalone PWA は OS 側がセッションの最終URLを復元することがある。
web/static/sw.js(自己破壊型 Service Worker)が activate 時に client.navigate(client.url) で現在URLへ再ナビゲートしている(static/sw.js:9-17)。このファイルは /sw.js として配信され、@nuxtjs/pwa が生成する workbox SW と同一パスで衝突している。
web/plugins/sw-update.client.js:17-27 が controllerchange で window.location.reload() を実行するため、リロードも現在URL基準になる。
対応案
web/static/sw.js の削除: 旧SWの掃除用(self-destroying SW)の役目は終えているはずで、workbox SW とのパス衝突を解消する。
- standalone 起動時の初期化プラグイン追加:
window.matchMedia("(display-mode: standalone)") で PWA 起動を検知し、セッション初回(sessionStorage フラグで判定)かつ現在パスが /omikuji や /sanpai などの途中画面なら / へリダイレクトするクライアントプラグインを追加する。
- 補助対応:
omikuji.vue / sanpai.vue で pageshow(event.persisted)を拾い、bfcache 復元時に状態を再初期化する。
確認方法
- Android Chrome / iOS Safari の実機でホーム画面に追加 →
/omikuji を表示した状態でアプリを完全終了 → 再起動し、トップ(/)が表示されること。
- デスクトップ Chrome の PWA インストールでも同様に確認。
- DevTools → Application → Service Workers で、登録されている
/sw.js が workbox 生成のもの1つだけであること。
- 通常のブラウザタブでのリロード・戻る操作では従来どおり現在URLが維持されること(リグレッション確認)。
問題
PWA(ホーム画面追加)やショートカットから起動すると、
start_url: "/"ではなく前回表示していたURL(例:/omikuji)がそのまま復元されてしまい、おみくじ画面が残った状態で起動する。原因分析
web/nuxt.config.js:137-138で manifest はstart_url: "/"/display: "standalone"を指定しているが、クライアント側に起動時の画面リセット処理がない。standalone PWA は OS 側がセッションの最終URLを復元することがある。web/static/sw.js(自己破壊型 Service Worker)がactivate時にclient.navigate(client.url)で現在URLへ再ナビゲートしている(static/sw.js:9-17)。このファイルは/sw.jsとして配信され、@nuxtjs/pwaが生成する workbox SW と同一パスで衝突している。web/plugins/sw-update.client.js:17-27がcontrollerchangeでwindow.location.reload()を実行するため、リロードも現在URL基準になる。対応案
web/static/sw.jsの削除: 旧SWの掃除用(self-destroying SW)の役目は終えているはずで、workbox SW とのパス衝突を解消する。window.matchMedia("(display-mode: standalone)")で PWA 起動を検知し、セッション初回(sessionStorageフラグで判定)かつ現在パスが/omikujiや/sanpaiなどの途中画面なら/へリダイレクトするクライアントプラグインを追加する。omikuji.vue/sanpai.vueでpageshow(event.persisted)を拾い、bfcache 復元時に状態を再初期化する。確認方法
/omikujiを表示した状態でアプリを完全終了 → 再起動し、トップ(/)が表示されること。/sw.jsが workbox 生成のもの1つだけであること。