前提・実現したいこと
WEBアプリをPWA化し、通知を受け取りたいと思っています。
Firebaseのmessagingを活用したいと思っているのですが、以下のエラーがコンソールに発生しています。
発生している問題・エラーメッセージ
FirebaseError: Messaging: We are unable to register the default service worker. Failed to register a ServiceWorker for scope ('https://*ドメイン*/firebase-cloud-messaging-push-scope') with script ('https://*ドメイン*/firebase-messaging-sw.js'): A bad HTTP response code (404) was received when fetching the script. (messaging/failed-service-worker-registration). at nt.<anonymous> (window-controller.ts:166) at tslib.es6.js:102 at Object.throw (tslib.es6.js:83) at i (tslib.es6.js:74)
該当のソースコード
html
1<!DOCTYPE html> 2<html lang="ja"> 3 4<head> 5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <title>省略</title> 8 <meta name="description" content="省略"> 9 <meta name="robots" content="noindex"> 10 <link rel="manifest" href="manifest.json"> 11 <script> 12 window.addEventListener('load', function() { 13 if ('serviceWorker' in navigator) { 14 navigator.serviceWorker.register("firebase-messaging-sw.js") 15 } 16 }); 17 </script> 18</head> 19 20<body> 21 省略 22 <script src="https://www.gstatic.com/firebasejs/8.6.3/firebase-app.js"></script> 23 <script src="https://www.gstatic.com/firebasejs/8.10.0/firebase-messaging.js"></script> 24 <script src="省略.js"></script> 25</body> 26 27</html>
json
1{ 2 "name": "省略", 3 "short_name": "省略", 4 "icons": [{ 5 "src": "../image/省略.png", 6 "sizes": "192x192", 7 "type": "image/png" 8 }, { 9 "src": "../image/省略.png", 10 "sizes": "512x512", 11 "type": "image/png" 12 }], 13 "theme_color": "省略", 14 "background_color": "省略", 15 "display": "standalone", 16 "orientation": "portrait", 17 "scope": "/省略/", 18 "start_url": "/省略/" 19}
Javascript
1const STATIC_DATA = [ 2 'index.html', 3 '省略.css', 4 '省略.js' 5]; 6 7var CACHE_VERSION = '省略'; 8 9self.addEventListener('install', function(e) { 10 e.waitUntil( 11 caches.open(CACHE_VERSION).then(function(cache) { 12 return cache.addAll(STATIC_DATA); 13 }) 14 ); 15}); 16 17var CACHE_DISP_VERSION = '省略'; 18 19self.addEventListener('fetch', function(event) { 20 21 event.respondWith( 22 caches.match(event.request) 23 .then(function(response) { 24 if (response) { 25 return response; 26 } else { 27 return fetch(event.request) 28 .then(function(res) { 29 return caches.open(CACHE_DISP_VERSION) 30 .then(function(cache) { 31 cache.put(event.request.url, res.clone()); 32 return res; 33 }) 34 }) 35 .catch(function() {}); 36 } 37 }) 38 ); 39}); 40 41self.addEventListener('activate', function(event) { 42 43 event.waitUntil( 44 caches.keys() 45 .then(function(keyList) { 46 return Promise.all(keyList.map(function(key) { 47 if (key !== CACHE_VERSION && key !== CACHE_DISP_VERSION) { 48 return caches.delete(key); 49 } 50 })); 51 }) 52 ); 53 return self.clients.claim(); 54}); 55 56self.addEventListener('push', function(event) { 57 var data = {}; 58 if (event.data) { 59 data = event.data.json(); 60 } 61 var title = data.notification.title || "無題"; 62 var message = data.notification.body || "メッセージが届いています。"; 63 event.waitUntil( 64 self.registration.showNotification(title, { 65 'body': message 66 }) 67 ); 68}); 69 70self.addEventListener('notificationclick', function(event) { 71 event.notification.close(); 72 73 const url = 'https://省略/省略'; 74 75 event.waitUntil(clients.matchAll({ 76 type: "window", 77 includeUncontrolled: true 78 }).then(function(clientList) { 79 for (const client of clientList) { 80 if (client.url === url && 'focus' in client) 81 return client.focus(); 82 } 83 if (clients.openWindow) 84 return clients.openWindow(url); 85 })); 86});
javascript
1var firebaseConfig = { 2 apiKey: "省略", 3 authDomain: "省略", 4 projectId: "省略", 5 storageBucket: "省略", 6 messagingSenderId: "省略", 7 appId: "省略" 8}; 9firebase.initializeApp(firebaseConfig); 10 11const messaging = firebase.messaging(); 12const vapidKey = "省略" 13 14window.onload = function() { 15 notification() 16}; 17 18function notification() { 19 Notification.requestPermission().then((permission) => { 20 if (permission === 'granted') { 21 messaging.getToken({ vapidKey: vapidKey }) 22 .then(async(currentToken) => { 23 if (currentToken) { 24 // トークン取得成功 25 *サーバー登録処理省略* 26 } 27 }) 28 .catch((err) => { 29 console.log(err); 30 }); 31 } else { 32 // 通知を拒否した場合 33 } 34 }); 35}
試したこと
要素を検証>アプリケーション>登録解除で再読み込みしてみましたが変わりません。
firebase-messaging-sw.jsをドメインの直下に置く必要があることは調べましたが、補足情報に記載した通りの構造になっています。
補足情報(FW/ツールのバージョンなど)
構造
public
ー省略
ーーindex.html
ーー省略.js
ーーfirebase-messaging-sw.js
ーーmanifest.json
あなたの回答
tips
プレビュー