6

ServiceWorkerを使用してユーザー通知を実装しています。ユーザーが最初の通知を、サイトを訪問し、承認すると、ServiceWorkerが登録し、サブスクライブされている:非常に最初の訪問でServiceWorkerがサブスクライブする前に登録を完了するまで待ちます。

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); 
}); 
} 

、これはとfailes:上の第二の訪問から

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

、 ServiceWorkerがその時点ですでにアクティブであるため、すべてがOKです。これはタイミングの問題のように見えます。 ServiceWorkerが登録に成功する前に、ServiceWorkerが正常に登録され、アクティブであることを確認するにはどうすればよいですか?

の下に示唆したように、私はnavigator.serviceWorker.readyを使用してみました:

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); 
}); 
} 

navigator.serviceWorker.ready.then()内部の一部が呼び出されることはありません。

+0

あなただけのクロム/クロムにプッシュAPIを使用しているのはなぜ? – Marco

+0

私のバックエンドは現在、GCM – Hokascha

+0

しかサポートしていないため、ペイロードがないと、Web Push標準は実際に実装するのが簡単です(基本的にエンドポイントURLへのPOST要求)。 – Marco

答えて

5

ServiceWorkerContainer.readyを使用できます。 MDNから

例:

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

例を表示できますか?あなたが提供した文書に登録はありません。 ready()呼び出しはどこで行われるべきですか? – Hokascha

+0

私はMDNの例を追加しました。 – Marco

+0

ああ、ページを初めて読み込んだときにサービスワーカーをアクティブにする方法を知りたいこともありますか? https://serviceworke.rs/immediate-claim.htmlをご覧ください。 – Marco

関連する問題