6

Kullanıcı bildirimlerini uygulamak için ServiceWorker kullanıyorum. Kullanıcı ilk bildirim siteyi ziyaret ve onayladığında, ServiceWorker'ın kayıtlı ve abone: ilk ziyaretimdeServiceWorker'ın abone olmasından önce kayıt işlemini tamamlamasını bekleyin

if ('serviceWorker' in navigator) { 
console.log('Service Worker is supported'); 
navigator.serviceWorker.register('/js/sw.js').then(function(reg) { 
    if(/chrom(e|ium)/.test(navigator.userAgent.toLowerCase())){ 
     reg.pushManager.subscribe({ 
      userVisibleOnly: true 
     }).then(function(sub) { 
      console.log('endpoint:', sub.endpoint); 
      endpoint = sub.endpoint; 
      fetch(MY_API+encodeURIComponent(endpoint), { 
        credentials: 'include' 
       }) 
     }); 
    } 
}).catch(function(err) { 
    console.log(':^(', err); 
}); 
} 

, bununla bozulana: ikinci ziyaret itibaren

Uncaught (in promise) DOMException: Subscription failed - no active Service Worker 

, Her şey yolunda, çünkü ServiceWorker o anda aktif durumda. Bu bir zamanlama sorunu gibi görünüyor. ServiceWorker'ın başarıyla kaydedildiğinden ve ona abone olmaya çalışmadan önce etkin olduğundan nasıl emin olabilirim?

if ('serviceWorker' in navigator) { 
console.log('Service Worker is supported'); 
navigator.serviceWorker.register('/js/sw.js').then(function(sreg) { 
    console.log(':^)', sreg); 
    navigator.serviceWorker.ready.then(function(reg) { 
     if(/chrom(e|ium)/.test(navigator.userAgent.toLowerCase())){ 
      reg.pushManager.subscribe({ 
       userVisibleOnly: true 
      }).then(function(sub) { 
       console.log('endpoint:', sub.endpoint); 
       endpoint = sub.endpoint; 
       fetch("https://www.wettfreun.de/?page=fetch&s=1&endpoint="+encodeURIComponent(endpoint), {credentials: 'include'}) 
      }); 
     } 
    }); 
}).catch(function(err) { 
    console.log(':^(', err); 
}); 
} 

Şimdi navigator.serviceWorker.ready.then() iç kısım asla denir: Aşağıda önerildiği gibi

Ben navigator.serviceWorker.ready kullanarak çalıştı.

+0

Neden yalnızca Chrome/Krom üzerinde itin API kullanıyorsunuz? – Marco

+0

Arka uçum şu anda yalnızca GCM'yi destekliyor – Hokascha

+0

Yük taşıma olmaksızın, Web Push standardının uygulanması gerçekten basittir (temel olarak son nokta URL'sine bir POST isteği). – Marco

cevap

5

ServiceWorkerContainer.ready'u kullanabilirsiniz. MDN den

Örnek:

function subscribe() { 
    var subscribeButton = document.querySelector('.js-subscribe-button'); 
    subscribeButton.disabled = false; 

    navigator.serviceWorker.ready.then(function(serviceWorkerRegistration) { 
    serviceWorkerRegistration.pushManager.subscribe() 
     .then(function(subscription) { 
     // The subscription was successful 
     subscribeButton.disabled = true; 
     return sendSubscriptionToServer(subscription); 
     }) 
     .catch(function(error) { 
     if (Notification.permission === 'denied') { 
      console.log('Permission for Notifications was denied'); 
      subscribeButton.disabled = true; 
     } else { 
      console.log('Unable to subscribe to push.', error); 
      subscribeButton.disabled = false; 
     } 
     }); 
    }); 
} 
+0

Bir örnek gösterebilir misiniz? Sağladığınız dokümanda kayıt yok. Ready() çağrısı nerede yapılmalı? – Hokascha

+0

MDN'den bir örnek ekledim. – Marco

+0

Ah, belki de sayfayı ilk yüklediğinizde servis çalışanının nasıl aktif hale getirileceğini bilmek ister misiniz? https://serviceworke.rs/immediate-claim.html dosyasına bakın. – Marco

İlgili konular