服务器工作者被注册两次
Server worker being registered twice
我正在使用 FCM 网络通知服务,当我调用注册函数时:
if ('serviceWorker' in navigator) {
window.addEventListener('load', function() {
navigator.serviceWorker.register('/sw.js').then(function(registration) {
// Registration was successful
console.log('ServiceWorker registration successful with scope: ', registration.scope);
}).catch(function(err) {
// registration failed :(
console.log('ServiceWorker registration failed: ', err);
});
});
}
service worker 被注册了两次,一次是因为这个函数,一次是 FCM script。这是我的服务人员代码:
importScripts('https://www.gstatic.com/firebasejs/3.5.2/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/3.5.2/firebase-messaging.js');
'messagingSenderId': '<my senderid>'
});
const messaging = firebase.messaging();
messaging.setBackgroundMessageHandler(function (payload) {
self.addEventListener('notificationclick', function (event) {
event.notification.close();
var promise = new Promise(function (resolve) {
setTimeout(resolve, 1000);
}).then(function () {
return clients.openWindow(payload.data.locator);
});
event.waitUntil(promise);
});
var notificationTitle = payload.data.title;
var notificationOptions = {
body: payload.data.body,
icon: payload.data.icon
};
return self.registration.showNotification(notificationTitle,
notificationOptions);
});
还有一件事,当我发送测试通知时,我单击第一条消息并正确打开 URL,但在 Chrome 的同一实例中,我单击打开所有其他消息第一条消息的URL。这个问题在 Firefox 上不会发生,只是 Chrome。我正在使用 chrome 版本 55
在使用 FCM 服务时,我导入了以下 Firebase 脚本
importScripts('https://www.gstatic.com/firebasejs/3.5.2/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/3.5.2/firebase-messaging.js');
firebase-messaging.js 文件具有 service worker 注册功能。
所以当我注册 service worker 时,我实际上是在注册另一个。
使用 firebase 消息传递 SDK,您无需调用注册。
如果你调用注册,你可以通过调用useServiceWorker()让SDK使用你的service worker(参见:https://firebase.google.com/docs/reference/js/firebase.messaging.Messaging#useServiceWorker)
if ('serviceWorker' in navigator) {
window.addEventListener('load', function() {
navigator.serviceWorker.register('/sw.js')
.then(function(registration) {
messaging.useServiceWorker(registration);
});
});
}
SDK 为您注册服务工作者的原因是它设置了一个范围,以防止它干扰您可能拥有的任何其他服务工作者。
关于您的第二个问题,您发送的是不同的网址还是相同的网址?
我正在使用 FCM 网络通知服务,当我调用注册函数时:
if ('serviceWorker' in navigator) {
window.addEventListener('load', function() {
navigator.serviceWorker.register('/sw.js').then(function(registration) {
// Registration was successful
console.log('ServiceWorker registration successful with scope: ', registration.scope);
}).catch(function(err) {
// registration failed :(
console.log('ServiceWorker registration failed: ', err);
});
});
}
service worker 被注册了两次,一次是因为这个函数,一次是 FCM script。这是我的服务人员代码:
importScripts('https://www.gstatic.com/firebasejs/3.5.2/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/3.5.2/firebase-messaging.js');
'messagingSenderId': '<my senderid>'
});
const messaging = firebase.messaging();
messaging.setBackgroundMessageHandler(function (payload) {
self.addEventListener('notificationclick', function (event) {
event.notification.close();
var promise = new Promise(function (resolve) {
setTimeout(resolve, 1000);
}).then(function () {
return clients.openWindow(payload.data.locator);
});
event.waitUntil(promise);
});
var notificationTitle = payload.data.title;
var notificationOptions = {
body: payload.data.body,
icon: payload.data.icon
};
return self.registration.showNotification(notificationTitle,
notificationOptions);
});
还有一件事,当我发送测试通知时,我单击第一条消息并正确打开 URL,但在 Chrome 的同一实例中,我单击打开所有其他消息第一条消息的URL。这个问题在 Firefox 上不会发生,只是 Chrome。我正在使用 chrome 版本 55
在使用 FCM 服务时,我导入了以下 Firebase 脚本
importScripts('https://www.gstatic.com/firebasejs/3.5.2/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/3.5.2/firebase-messaging.js');
firebase-messaging.js 文件具有 service worker 注册功能。 所以当我注册 service worker 时,我实际上是在注册另一个。
使用 firebase 消息传递 SDK,您无需调用注册。
如果你调用注册,你可以通过调用useServiceWorker()让SDK使用你的service worker(参见:https://firebase.google.com/docs/reference/js/firebase.messaging.Messaging#useServiceWorker)
if ('serviceWorker' in navigator) {
window.addEventListener('load', function() {
navigator.serviceWorker.register('/sw.js')
.then(function(registration) {
messaging.useServiceWorker(registration);
});
});
}
SDK 为您注册服务工作者的原因是它设置了一个范围,以防止它干扰您可能拥有的任何其他服务工作者。
关于您的第二个问题,您发送的是不同的网址还是相同的网址?