我正在使用firebase messaging
的网站上工作,为此firebase
的自定义服务工作者已在网站上注册。
网站有点网络聊天,可以在firebase database
中同步和存储消息,网站使用angular-ui-router
从网址获取消息密钥,网站会在收到新消息时显示通知如果点击了通知,则从客户端和URL修改相关消息,但是当网站没有聚焦时,这对服务工作者来说很困难,因为服务工作者抛出错误unable to navigate
< / p>
服务工作者代码是这样的:
importScripts('https://www.gstatic.com/firebasejs/4.5.0/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/4.5.0/firebase-messaging.js');
firebase.initializeApp({
"messagingSenderId": "######"
});
const messaging = firebase.messaging();
messaging.setBackgroundMessageHandler(function(payload){
var title = payload.data.title;
var options = {
body: payload.data.message,
icon: "apple-touch-icon.png",
data: {
postId: payload.data.postKey
}
};
return self.registration.showNotification(title, options);
});
self.addEventListener("notificationclick", function(evt){
var postKey = evt.notification.data.postId;
var origin = evt.target.origin;
var urlTarget = origin + "/#!/" + postKey;
evt.notification.close();
evt.waitUntil(
self.clients.matchAll({
includeUncontrolled: true,
type: "window"
})
.then(function(clientList) {
if(clientList.length > 0){
var client = clientList[0];
client.navigate(urlTarget);
if(client.focus){
return client.focus();
}
}
if(self.clients.windowOpen){
return self.clients.windowOpen(urlTarget);
}
}));
});
我期待的行为如下:
焦点:
https://example.com/#!/
通知后点击:https://example.com/#!/-key
非焦点:
焦点/开放时:https://example.com/#!/-key
显示焦点通知的代码工作正常,所以我不认为发布代码是必要的。
对此的任何帮助表示赞赏,我已经在字面上花了所有我想到的替代选项
答案 0 :(得分:0)
作为per the specification(参见4.2.10,步骤4),WindowClient.navigate()
可能拒绝的原因之一是客户端的活动服务工作者与当前服务工作者不同执行代码。换句话说,如果窗口不受当前服务工作者控制,则该服务工作者无法告诉它导航到给定的URL。
我建议您使用
self.clients.matchAll({
includeUncontrolled: false,
type: 'window'
})
确保您只返回当前服务工作者控制 的WindowClient
个实例。