|
6 | 6 | } from 'firebase/messaging' |
7 | 7 |
|
8 | 8 | import apis from '/@/lib/apis' |
9 | | -import { wait } from '/@/lib/basic/timer' |
| 9 | +import { wait, waitUntil } from '/@/lib/basic/timer' |
10 | 10 | import { isIOSApp, isPWA, isWebKit } from '/@/lib/dom/browser' |
11 | 11 | import router from '/@/router' |
12 | 12 | import { useToastStore } from '/@/store/ui/toast' |
@@ -90,12 +90,37 @@ export const connectFirebase = async (onCanUpdate: OnCanUpdate) => { |
90 | 90 | })() |
91 | 91 |
|
92 | 92 | if (permission === 'granted') { |
| 93 | + // iOS PWA の場合、許可状態がService Workerコンテキストに反映されるまで待つ |
| 94 | + // https://stackoverflow.com/questions/76590928/pwa-on-ios-notification-permission-return-default-whatever-we-chose |
| 95 | + if (isWebKit() && isPWA()) { |
| 96 | + const success = await waitUntil( |
| 97 | + () => Notification.permission === 'granted', |
| 98 | + { interval: 10, timeout: 500 } |
| 99 | + ) |
| 100 | + if (!success) { |
| 101 | + // eslint-disable-next-line no-console |
| 102 | + console.warn( |
| 103 | + '[Notification] iOS PWA: permission state did not update within timeout' |
| 104 | + ) |
| 105 | + } |
| 106 | + } |
93 | 107 | notify({ title: `ようこそ${appName}へ!!` }, true) |
94 | 108 | } else { |
95 | 109 | // eslint-disable-next-line no-console |
96 | 110 | console.warn(`[Notification] permission ${permission}`) |
97 | 111 | } |
98 | 112 | } |
| 113 | + |
| 114 | + // iOS PWAの場合、Service Worker登録前に許可状態を最終確認 |
| 115 | + // Service Workerコンテキストは作成時の許可状態を保持するため、 |
| 116 | + // 'granted' 状態で作成されることを保証する |
| 117 | + if (isWebKit() && isPWA() && Notification.permission !== 'granted') { |
| 118 | + // eslint-disable-next-line no-console |
| 119 | + console.warn( |
| 120 | + `[Notification] iOS PWA: permission is ${Notification.permission}, skipping service worker registration` |
| 121 | + ) |
| 122 | + return |
| 123 | + } |
99 | 124 | } else { |
100 | 125 | // eslint-disable-next-line no-console |
101 | 126 | console.warn(`[Notification] Notification does not exists`) |
|
0 commit comments