Firebase消息传递错误:在获取令牌之前使用服务工作者

时间:2018-03-07 10:40:03

标签: javascript firebase firebase-cloud-messaging

我正在尝试将FCM与angularjs一起使用,所以在初始化firebase之后我编写了以下代码:

messaging = firebase.messaging();
$window.navigator.serviceWorker.register($rootScope.app.base_url + '/app/lib/firebaseCustomWorker.js')
.then(function(registration) {
    messaging.useServiceWorker(registration);
    messaging.requestPermission().then(function(){  
    messaging.getToken()
    .then(function(currentToken) {
        console.log(currentToken);
    })
    .catch(function(err) {
        console.log('An error occurred while retrieving token. ', err);
    });
}).catch(function(err){console.log(err)});

问题是最后一行有时会捕获一个错误,该错误出现在控制台中,代码为"messaging/use-sw-before-get-token",并显示以下消息:

  

FirebaseError:消息:您必须在调用getToken()之前调用useServiceWorker()以确保使用您的服务工作者。 (消息/应用-SW-之前-获得令牌)。

正如您在上面的代码中看到的那样,我只在致电getToken()之后和useServiceWorker()之后致电requestPermission()

我挖掘了第35行的原始firebase-messaging.js文件,但遗憾的是没有得到任何关于这种情况发生的线索

3 个答案:

答案 0 :(得分:1)

我知道这可能很疯狂,会适得其反,但它确实有效。

 .
 .
 .
 if('undefined' !== typeof messaging.b )
      delete(messaging.b);
 messaging.useServiceWorker(registration);
 .
 .
 .

受到阅读firebase-messaging.js的启发

答案 1 :(得分:0)

我对您的回答有一个类似的疯狂主意:

if (!firebase.apps[0]) {
    firebase.initializeApp(config);
}

我发现使用firebase.initializeApp(config)navigator.serviceWorker.register更好。可以多次调用它,而不必担心是否加载了服务工作者。只需将其放在应用程序的每个页面上即可:

var config = {
    apiKey: "...",
    authDomain: "...",
    databaseURL: "...",
    projectId: "...",
    storageBucket: "...",
    messagingSenderId: "..."
}

firebase.initializeApp(config);

答案 2 :(得分:0)

尝试使用新版本的 firebase https://firebase.google.com/docs/reference/js/firebase.messaging.Messaging#gettoken

 messaging.getToken({
                        serviceWorkerRegistration: registration,
                        vapidKey: keyPair
                    }).then((currentToken) => {
                        if (currentToken) {
                            console.log(currentToken)
                        } else {
                            // Show permission request UI
                            console.log('No registration token available. Request permission to generate one.');
                        }
                    }).catch((err) => {
                        console.log('An error occurred while retrieving token. ', err);
                    });