我有一个共同的serviceworker escenario,我想要点击通知点击并关注通知来自的选项卡。但是,clients变量始终为空,其长度为0
console.log("sw startup");
self.addEventListener('install', function (event) {
console.log("SW installed");
});
self.addEventListener('activate', function (event) {
console.log("SW activated");
});
self.addEventListener("notificationclick", function (e) {
// Android doesn't automatically close notifications on click
console.log(e);
e.notification.close();
// Focus tab if open
e.waitUntil(clients.matchAll({
type: 'window'
}).then(function (clientList) {
console.log("clients:" + clientList.length);
for (var i = 0; i < clientList.length; ++i) {
var client = clientList[i];
if (client.url === '/' && 'focus' in client) {
return client.focus();
}
}
if (clients.openWindow) {
return clients.openWindow('/');
}
}));
});
注册就是这个:
this.doNotify = function (notification) {
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('sw.js').then(function (reg) {
requestCreateNotification(notification, reg);
}, function (err) {
console.log('sw reg error:' + err);
});
}
...
}
chrome:// serviceworker-internals / output表明注册和安装都很好。但是,当按下通知时,clientList为空。我试过删除过滤器类型:'window'但结果仍然相同。由于客户端为空,因此始终会打开一个新窗口。我做错了什么?
答案 0 :(得分:32)
您自己评论中的怀疑是正确的。页面由服务工作者控制,导航到服务工作者注册的原点。因此,实际初始化服务工作者的原始页面加载本身并不受控制。这就是为什么一旦您使用新标签访问或刷新,工作人员只能找到您的标签。
然而(正如Jeff Posnick在评论中指出的那样)你可以获得如下不受控制的页面:ServiceWorkerClients.matchAll({includeUncontrolled: true, type: 'window'})
。
答案 1 :(得分:3)
尝试让服务工作者立即声明页面。 E.g:
self.addEventListener('install', event => event.waitUntil(self.skipWaiting()));
self.addEventListener('activate', event => event.waitUntil(self.clients.claim()));
有关更复杂的示例,请参阅https://serviceworke.rs/immediate-claim.html。