【发布时间】:2018-10-01 22:59:51
【问题描述】:
我正在使用 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 调用发生在页面完成加载之前,所以 eventListener 还没有注册来监听该消息?对吗?
如何从服务人员打开一个新窗口并将消息发送到该新窗口。
【问题讨论】:
-
嗨,@procedurally-generated 你的问题得到答案了吗?
-
你解决了吗?
-
@Oliver 不,只是添加了延迟。在允许页面加载 3/4 秒后执行 postMessage。
-
这是一种解决方法,但不能是唯一的解决方案...
标签: firebase-cloud-messaging service-worker service-worker-events