简体   繁体   English

FirebaseError browserErrorMessage:“无法注册 ServiceWorker:ServiceWorker 脚本评估失败”

[英]FirebaseError browserErrorMessage: "Failed to register a ServiceWorker: ServiceWorker script evaluation failed"

I have used FCM as per this https://firebase.google.com/docs/cloud-messaging/js/client , and I am getting below error:我按照这个https://firebase.google.com/docs/cloud-messaging/js/client使用了 FCM,但出现以下错误:

FirebaseError {code: "messaging/failed-serviceworker-registration", message: "Messaging: We are unable to register the default s…ed (messaging/failed-serviceworker-registration).", browserErrorMessage: "Failed to register a ServiceWorker: ServiceWorker script evaluation failed", stack: "FirebaseError: Messaging: We are unable to registe…tp://localhost:3000/static/js/0.chunk.js:57713:26"}
browserErrorMessage: "Failed to register a ServiceWorker: ServiceWorker script evaluation failed"

code: "messaging/failed-serviceworker-registration"
message: "Messaging: We are unable to register the default service worker. Failed to register a ServiceWorker: ServiceWorker script evaluation failed (messaging/failed-serviceworker-registration)."
stack: "FirebaseError: Messaging: We are unable to register the default service worker. Failed to register a ServiceWorker: ServiceWorker script evaluation failed (messaging/failed-serviceworker-registration).↵    at http://localhost:3000/static/js/0.chunk.js:57713:26"
__proto__: Error

What I am doing:我在做什么:

  1. Created a react app by create-react-app pushnotification通过 create-react-app pushnotification 创建了一个 React 应用程序

  2. Downloaded firebase using sudo npm install --save firebase in my project在我的项目中使用 sudo npm install --save firebase 下载了 firebase

  3. created a firebase.js file in src folder of the react app with below content在 react 应用程序的 src 文件夹中创建了一个 firebase.js 文件,内容如下

    import firebase from 'firebase'; var config = { apiKey: "MY_KEY", authDomain: "MY_Domain", databaseURL: "MY_DBurl", projectId: "My_ProjectID", storageBucket: "My_StorageBucket", messagingSenderId: "My_Msg_id" }; firebase.initializeApp(config); const messaging = firebase.messaging(); messaging.requestPermission().then(function(){ console.log("Have Permission"); }).catch(function(error){ console.log(error); })

and when I refresh my web app it asks for the permission like below:当我刷新我的网络应用程序时,它会请求如下权限:

在此处输入图像描述

So far everything is working, now I am updating my firebase.js file like below to send push notification:到目前为止一切正常,现在我正在更新我的 firebase.js 文件,如下所示以发送推送通知:

import firebase from 'firebase';

var config = {
    apiKey: "MY_KEY",
    authDomain: "MY_Domain",
    databaseURL: "MY_DBurl",
    projectId: "My_ProjectID",
    storageBucket: "My_StorageBucket",
    messagingSenderId: "My_Msg_id"
};
firebase.initializeApp(config);

const messaging = firebase.messaging();

messaging.requestPermission().then(function(){
    console.log("Have Permission");
    return messaging.getToken();
}).then(function(token){
    console.log(token)
}).catch(function(error){
    console.log(error);
});

messaging.onMessage(function(payload){
    console.log(payload);
})

also I have create a firebase-messaging-sw.js file with below content:我还创建了一个包含以下内容的 firebase-messaging-sw.js 文件:

import firebase from 'firebase';

var config = {
    apiKey: "MY_KEY",
    authDomain: "MY_Domain",
    databaseURL: "MY_DBurl",
    projectId: "My_ProjectID",
    storageBucket: "My_StorageBucket",
    messagingSenderId: "My_Msg_id"
};
firebase.initializeApp(config);

const messaging = firebase.messaging();

In my public folder and now when I do a page refresh I get above error:在我的公用文件夹中,现在当我刷新页面时出现上述错误:

在此处输入图像描述

For some reason, doing firebase integrations take days because of their incomplete/unclear docs (at least for me.).出于某种原因,由于文档不完整/不清楚(至少对我而言),进行 firebase 集成需要几天时间。 Sharing what worked for me.分享对我有用的东西。

My setup:我的设置:

  • App: react web app应用程序:反应网络应用程序
  • Using firebase js sdk使用 firebase js sdk

What worked for me:对我有用的是:

  1. Directory structure:目录结构:
-src
-public
--firebase-messaging-sw.js
--index.html

Yes, had to put firebase-messaging-sw.js inside 'public' instead of root folder.是的,必须将 firebase-messaging-sw.js 放在“public”而不是根文件夹中。 Maybe it has to be at same depth as of the main entry point file (index.html)也许它必须与主入口点文件 (index.html) 处于相同的深度

  1. Added these scripts in index.html: ( reference )在 index.html 中添加了这些脚本:( 参考
<script src="https://www.gstatic.com/firebasejs/8.2.2/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/8.2.2/firebase-messaging.js"></script>
<script type="text/javascript">
    try {
        if (!firebase.apps.length) {
            const firebaseConfig = { //from firebase project setting
            };
            firebase.initializeApp(firebaseConfig);
        }
    
        const messaging = firebase.messaging();
    
        messaging.onMessage((payload) => {
            console.log('Message received. ', payload);
    
            const notificationTitle = 'OnMessage Title';
            const notificationOptions = {
                body: 'OnMessage body.'
            };
    
            return self.registration.showNotification(notificationTitle, notificationOptions);
        });
    
        function resetUI() {
            const vapidKey = '<>'; //from firebase project settings
            messaging.getToken({ vapidKey: vapidKey }).then((currentToken) => {
                console.log("currentToken", currentToken);
                if (currentToken) {
                    //..
                } else {
                    console.log('No registration token available. Request permission to generate one.');
                    requestPermission();
                }
            }).catch((err) => {
                console.log('An error occurred while retrieving token. ', err);
            });
        }
    
        function requestPermission() {
            console.log('Requesting permission...');
            Notification.requestPermission().then((permission) => {
                if (permission === 'granted') {
                    console.log('Notification permission granted.');
                    resetUI();
                } else {
                    console.log('Unable to get permission to notify.');
                }
            });
        }
    
        resetUI();
    } catch (e) {
        console.log("firebase startup error ", e);
    }
</script>

Later, I was able to move the above code in script to App.js.后来,我能够将脚本中的上述代码移动到 App.js 中。

  1. firebase-messaging-sw.js: ( reference ) firebase-messaging-sw.js:( 参考
  • Had to put firebase.intializeApp() in both index.html and in this file, otherwise I was getting "firebase serviceworker script evaluation failed".必须将 firebase.intializeApp() 放在 index.html 和此文件中,否则我会得到“firebase serviceworker 脚本评估失败”。
importScripts('https://www.gstatic.com/firebasejs/8.2.2/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/8.2.2/firebase-messaging.js');
    
const vapidKey = '<>'; //from firebase project settings
const firebaseConfig = { //from firebase project settings
    ...
};
    
if (!firebase.apps.length) {
    try {
        firebase.initializeApp(firebaseConfig);
    } catch (e) {
        console.log("sw error", e)
    }
}
    
let messaging = firebase.messaging();
    
messaging.onBackgroundMessage(function (payload) {
    console.log('firebase Received background message ', JSON.stringify(payload));
    
    // const notificationTitle = 'Background Message Title';
    // const notificationOptions = {
    //     body: 'Background Message body.',
    //     // icon: '../assets/icon.png'
    // };
    
    // return self.registration.showNotification(notificationTitle,
    //     notificationOptions);
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Firebase 云消息传递 - 注册服务工作时出错(...ServiceWorker 脚本评估失败) - Firebase Cloud Messaging - Error when registering service working (...ServiceWorker script evaluation failed) FCM getToken() Failed to register a ServiceWorker for scope 错误 Flutter web - FCM getToken() Failed to register a ServiceWorker for scope error Flutter web Angular + Firebase:无法注册默认服务工作者。 scope注册ServiceWorker失败 - Angular + Firebase: unable to register default service worker. Failed to register a ServiceWorker for scope [FirebaseError: Firebase: 错误 (auth.network-request-failed) - [FirebaseError: Firebase: Error (auth/network-request-failed) Serviceworker 必须是 web 应用程序清单中的字典 - Serviceworker must be a dictionary in your web app manifest TypeError:undefined 不是 object(正在评估“navigator.serviceWorker.addEventListener”) - TypeError: undefined is not an object (evaluating 'navigator.serviceWorker.addEventListener') FirebaseError:我们无法注册默认服务工作者 - FirebaseError : We are unable to register the default service worker Codepipeline script_start 失败脚本在指定位置不存在 - Codepipeline script_start failed Script does not exist at specified location 收到错误“FirebaseError:消息:我们无法注册默认服务工作者。” 使用 Sveltekit 设置消息传递 - Getting error "FirebaseError: Messaging: We are unable to register the default service worker." setting up messaging with Sveltekit Angular 9 使用 AWS S3 和 Cloudfront 加载模块脚本失败 - Angular 9 Failed to load module script using AWS S3 and Cloudfront
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM