2016-09-21 1 views
3

사용자를 구독하려하지만 처음 오류가 발생했습니다. 사용자가 이미잡히지 않음 (약속 있음) DOMException : 구독 실패 - 활성화 된 서비스 작업자가 없음

활성화되어 있기 때문에 두 번째 시간, 그것은이 내 코드입니다 노력하고 있습니다 :

if ('serviceWorker' in navigator) { 
    console.log('Service Worker is supported'); 
    navigator.serviceWorker.register('sw.js').then(function(reg) { 
    console.log(':^)', reg); 
    reg.pushManager.subscribe({ 
     userVisibleOnly: true 
    }).then(function(sub) { 
     console.log('endpoint:', sub.endpoint); 
     var div = document.getElementById('id'); 
     div.innerHTML = div.innerHTML + sub.endpoint; 
     // var b = document.getElementsByTagName('body')[0]; 
     //b.appendChild(div); 
     //alert(sub.endpoint); 
    }); 
    }); 
} 

이미 다음을하려고했으나 ready.then() 방법은 발생되지 않습니다

if ('serviceWorker' in navigator) { 
    console.log('Service Worker is supported'); 
    navigator.serviceWorker.register('sw.js').then(function(sreg) { 
    console.log(':^)', sreg); 
    navigator.serviceWorker.ready.then(function(reg) { 
     reg.pushManager.subscribe({ 
     userVisibleOnly: true 
     }).then(function(sub) { 
     console.log('endpoint:', sub.endpoint); 
     var div = document.getElementById('id'); 
     div.innerHTML = div.innerHTML + sub.endpoint; 
     // var b = document.getElementsByTagName('body')[0]; 
     //b.appendChild(div); 
     //alert(sub.endpoint); 
     }); 
    }); 
    }); 
} 

아이디어가 있으십니까?

답변

1

서비스 작업자 상태를 확인하여이 문제를 해결할 수 있습니다. 서비스 작업자가 활성화 된 경우에만 작업을 수행하십시오. pushnotification에 대한

navigator.serviceWorker.register('sw.js').then(function(reg) { 
if(reg.installing) { 
     console.log('Service worker installing'); 
    } else if(reg.waiting) { 
     console.log('Service worker installed'); 
    } else if(reg.active) { 
     console.log('Service worker active'); 
    } 
// Include below mentioned validations 
} 

점검 지원 또는이 두 가지 검사가 당신에게 기능을 구현 한 후

// Check if push messaging is supported 
    if (!('PushManager' in window)) { 
     console.log('Push messaging isn\'t supported.'); 
     return; 
    } 
    // 
    if (Notification.permission === 'denied') { 
     console.log('The user has blocked notifications.'); 
     return; 
    } 

를 사용하지 않습니다.

navigator.serviceWorker.ready.then(function(reg) { .... }) 

희망이 당신은 서비스 노동자 기다려야합니다

+0

활성화되어 있지만 여전히 사용자를 등록하지 않으면 파악을위한

사용하여 stateChange 청취자는, 이것은 내가 내 대답을 편집 한 내 문제 – user6609184

+0

입니다. 당신은 이것을 확인할 수 있습니다 – vbharath

+0

아직도 작동하지 않습니다 – user6609184

1

구독을 트리거하기 전에 활성화하는 데 도움이됩니다. 서비스 노동자

navigator.serviceWorker.register(workerFileName, {scope: "/"}) 
    .then(
    function (reg) { 
     var serviceWorker; 
     if (reg.installing) { 
      serviceWorker = reg.installing; 
      // console.log('Service worker installing'); 
     } else if (reg.waiting) { 
      serviceWorker = reg.waiting; 
      // console.log('Service worker installed & waiting'); 
     } else if (reg.active) { 
      serviceWorker = reg.active; 
      // console.log('Service worker active'); 
     } 

     if (serviceWorker) { 
      console.log("sw current state", serviceWorker.state); 
      if (serviceWorker.state == "activated") { 
       //If push subscription wasnt done yet have to do here 
       console.log("sw already activated - Do watever needed here"); 
      } 
      serviceWorker.addEventListener("statechange", function(e) { 
       console.log("sw statechange : ", e.target.state); 
       if (e.target.state == "activated") { 
        // use pushManger for subscribing here. 
        console.log("Just now activated. now we can subscribe for push notification") 
        subscribeForPushNotification(reg); 
       } 
      }); 
     } 
    }, 
    function (err) { 
     console.error('unsuccessful registration with ', workerFileName, err); 
    } 
); 
관련 문제