2016-09-18 64 views
0

我正在嘗試更新ServiceWorker的工作。僅針對新客戶端更新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還爲老客戶。

感謝

+0

*「但它不會被激活新頁面。*」:讓我們諮詢我們的水晶球,找出原因;或者換句話說:您應該爲我們提供一些具體的信息/代碼,以瞭解爲什麼您的新服務未啓用新頁面。 – trincot

+0

我添加了有關如何檢查版本不匹配的信息。我嘗試強制更新()並重新加載頁面時,版本不匹配,但我最終在一個無限循環。 –

回答

1

調用一個服務人員的install事件處理程序中self.skipWaiting()會造成新安裝的服務人員立即激活,即使有現有的舊服務人員這是目前其他客戶端激活。如果沒有self.skipWaiting(),新安裝的服務人員將保持waiting狀態,直到以前服務人員的所有其他客戶端都關閉。

調用從activate事件處理中self.clients.claim()有時用爲好,但前提是你要新激活的服務人員把已經開放客戶端或者是失控的,或由一箇舊版本的服務控制的控制工人。在你的情況下,這聽起來像你不要想要的行爲,所以你不應該打電話self.clients.claim()

+0

通過測試(在Chrome中的本地主機上),似乎'skipWaiting()'本身會導致*新激活的服務工作人員控制已經打開的客戶機,這些客戶機是不受控制的,或者是由舊版本的服務人員控制的* ? –