2016-10-20 2 views
1

페이지가로드 될 때마다 서비스 작업자에게 메시지를 보내려고합니다.Service Worker 컨트롤러 교환이 실행되지 않음

처음으로 페이지를로드하면 register()가 호출 된 다음 navigator.serviceWorker에서 "controllerchange"이벤트를 수신하지만이 이벤트는 발생하지 않습니다.

서비스 작업자를 postMessaging 할 수있는 시점을 어떻게 알 수 있습니까? 나는 서비스 노동자를 postMessaging 시작할 때

navigator.serviceWorker.register(swURL).then(function(){ 
    var sw; 

    if (navigator.serviceWorker.controller) { 
     sw = navigator.serviceWorker.controller; 
     sw.postMessage('ping'); 
     return; 
    } 

    function onchange(){ 
     sw = navigator.serviceWorker.controller; 
     sw.postMessage('ping'); 
     navigator.serviceWorker.removeEventListener('controllerchange', onchange); 
    } 

    navigator.serviceWorker.addEventListener('controllerchange', onchange); 
}).catch(function(err) { 
    // registration failed :(
    console.log('ServiceWorker registration failed: ', err); 
}); 

답변

1

어떻게 알 수 있습니까?

그냥 그 비트에 집중 :

// navigator.serviceWorker.ready can be used from anywhere in your 
// page's JavaScript, at any time. 
// It will wait until there's an active service worker, and then resolve. 
navigator.serviceWorker.ready.then(registration => 
    registration.active.postMessage('ping'); 
}); 

당신이 왜 controllerchange 이벤트 리스너의 바닥에 도달 할 경우 : 나는 navigator.serviceWorker.ready 약속을 사용합니다 다음과 같은 방법을 권 해드립니다 서비스 직원의 activate 이벤트에서 clients.claim()을 사용하지 않는다면 새로 활성화 된 서비스 작업자가 현재 페이지를 제어하지 않는다는 것을 추측 할 수 있습니다.