【发布时间】:2016-09-18 19:53:34
【问题描述】:
我正在尝试更新我的 ServiceWorker。
我有一个老服务人员,一些窗口在它的控制之下。现在有一个新版本的 ServiceWorker。它得到正确安装。但它不会为新页面激活。我的目标是为旧页面保留旧页面,为每个查看的新标签/页面保留新页面。
知道如何做到这一点吗?
编辑:
我如何检查新的服务人员是否未更新:
我有一个 sendMessage 方法:
sendMessage(message): Promise {
const channel = new MessageChannel();
const p1 = channel.port1;
const result = new Promise(resolve => {
p1.onmessage = ({ data }) => {
resolve(data);
};
});
serviceWorker.controller.postMessage(message, [channel.port2]);
return result;
}
然后我用它来检查页面开始
this.ready = this.sendMessage('version')
.then(version => {
if (version !== process.env.BUILD_NUMBER) {
console.log('$$ Version mismatch, reinstalling service worker');
throw new Error('build mismatch');
}
return serviceWorker.controller;
});
我在 ServiceWorker 中回答
self.addEventListener('message', ({ data, ports }) => {
const client = ports[0];
if (data === 'version') {
client.postMessage(process.env.BUILD_NUMBER);
}
});
编辑
添加:
event.waitUntil(self.clients.claim());
有帮助,但它也为老客户激活了 ServiceWorker。
谢谢
【问题讨论】:
-
“但它不会为新页面激活。”:让我们看看我们的水晶球找出原因;或者换句话说:您应该为我们提供一些具体的信息/代码,以了解为什么您的新服务没有为新页面激活。
-
我添加了有关如何检查版本不匹配的信息。当版本不匹配时,我尝试强制更新()并重新加载页面,但最终陷入无限循环。