Javascript 正在注册两次的服务器工作进程
我正在使用FCM web通知服务,当我调用register函数时:Javascript 正在注册两次的服务器工作进程,javascript,firebase,firebase-cloud-messaging,service-worker,web-notifications,Javascript,Firebase,Firebase Cloud Messaging,Service Worker,Web Notifications,我正在使用FCM web通知服务,当我调用register函数时: if ('serviceWorker' in navigator) { window.addEventListener('load', function() { navigator.serviceWorker.register('/sw.js').then(function(registration) { // Registration was successful
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);
});
});
}
服务人员注册了两次,一次是因为此功能,另一次是由。这是我的服务人员代码:
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);
});
importScripts('https://www.gstatic.com/firebasejs/3.5.2/firebase-app.js');
进口文件('https://www.gstatic.com/firebasejs/3.5.2/firebase-messaging.js');
“messagingSenderId”:”
});
const messaging=firebase.messaging();
messageing.setBackgroundMessageHandler(函数(有效负载){
self.addEventListener('notificationclick',函数(事件){
event.notification.close();
var承诺=新承诺(函数(解析){
设置超时(解析,1000);
}).然后(函数(){
返回clients.openWindow(payload.data.locator);
});
事件。等待(承诺);
});
var notificationTitle=payload.data.title;
变量通知选项={
body:payload.data.body,
图标:payload.data.icon
};
返回self.registration.showNotification(notificationTitle,
通知选项);
});
还有一件事,当我发送测试通知时,我单击第一条消息,它会正确打开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文件具有服务人员注册功能。
因此,当我注册服务人员时,实际上我正在注册另一个服务人员。使用firebase messaging SDK,您无需调用register 如果调用register,则可以通过调用useServiceWorker()使SDK使用您的服务工作者(请参阅:) SDK为您注册服务工作者的原因是它设置了一个作用域,以防止它干扰您可能拥有的任何其他服务工作者 关于第二个问题,您发送的是不同的URL还是相同的URL
if ('serviceWorker' in navigator) {
window.addEventListener('load', function() {
navigator.serviceWorker.register('/sw.js')
.then(function(registration) {
messaging.useServiceWorker(registration);
});
});
}