我正在使用service worker处理后台通知。当我收到一条消息时,我使用
我面临的问题是
我如何从服务工作者打开一个新窗口并向该新窗口发送消息?
self.registration.showNotification(title, { icon, body })
创建一个新的Notification
。我使用self.addEventListener('notificationclick', ()=>{})
监听通知的点击事件。点击后,我会检查是否有任何打开的WindowClient
,如果有,我会获取其中一个窗口客户端并在其上调用postMessage
,以将通知中的数据发送到应用程序以允许应用程序处理通知。如果没有打开的窗口,我会调用openWindow
,等待完成后再使用postMessage
将数据发送到该窗口。event.waitUntil(
clients.matchAll({ type: 'window' }).then((windows) => {
if (windows.length > 0) {
const window = windows[0];
window.postMessage(_data);
window.focus();
return;
}
return clients.openWindow(this.origin).then((window) => {
window.postMessage(_data);
return;
});
})
);
我面临的问题是
openWindow
内部的postMessage
调用从未被传递。我猜测这是因为在页面完成加载之前,WindowClient
上的postMessage
调用已经发生了,因此事件侦听器尚未注册以侦听该消息?是这样吗?我如何从服务工作者打开一个新窗口并向该新窗口发送消息?