Pro*_*ted 5 service-worker firebase-cloud-messaging service-worker-events
我正在使用 Service Worker 来处理后台通知。当我收到一条消息时,我正在Notification使用self.registration.showNotification(title, { icon, body }). 我正在使用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;
});
})
);
Run Code Online (Sandbox Code Playgroud)
我面临的问题是postMessage内部的呼叫openWindow从未送达。我猜这是因为postMessage调用WindowClient发生在页面完成加载之前,所以 eventListener 尚未注册以侦听该消息?那正确吗?
如何从 Service Worker 打开一个新窗口并将 postMessage 发送到该新窗口。
nik*_*tko -3
我遇到了同样的问题。我的错误是我在窗口上注册了事件处理程序。但它应该像这样在 Service Worker 上注册:
// next line doesn't work
window.addEventListener("message", event => { /* handler */ });
// this one works
navigator.serviceWorker.addEventListener('message', event => { /* handler */ });
Run Code Online (Sandbox Code Playgroud)
请参阅以下页面的示例:
https://developer.mozilla.org/en-US/docs/Web/API/Clients
https://developer.mozilla.org/en-US/docs/Web/API/Client/postMessage
UPD:澄清一下,这段代码进入新打开的窗口。检查 Chromium v.66。
| 归档时间: |
|
| 查看次数: |
833 次 |
| 最近记录: |