user3770803
user3770803

Reputation: 145

Vue js + trouble getting the service worker registration object

I have a vue js pwa project,and i want to have access to the service-worker registration object in different components.In my main component,App.vue i register the service-worker like so:

  created(){
    if ("serviceWorker" in navigator && "PushManager" in window) {
  console.log("Service Worker and Push is supported");

  navigator.serviceWorker
    .register("/service-worker.js")
    .then(function(swReg) {
      console.log("Service Worker is registered");
      console.log(swReg)
    })
    .catch(function(error) {
      console.error("Service Worker Error", error);
    });
} else {
  console.warn("Push messaging is not supported");
}
}

the registration is performed successfully , then in a child component i get the register object like this:

    created(){
navigator.serviceWorker.getRegistrations().then(registrations => {
      registrations.pushManager.getSubscription()
  .then(function(subscription) {
    this.isSubscribed = !(subscription === null);

    if (this.isSubscribed) {
      console.log('User IS subscribed.');
    } else {
      console.log('User is NOT subscribed.');
    }
  });
  console.log(registrations);
});

but that only returns an error:

Uncaught (in promise) TypeError: Cannot read property 'getSubscription' of undefined

the weird part is the console log i have at the end of the created method logs a normal register service worker and is not "undefined". how should i properly get the register obj?

Upvotes: 2

Views: 1396

Answers (1)

mormor33
mormor33

Reputation: 61

Use navigator.serviceWorker.getRegisteration() instead of .getRegisterations().

The latter returns an array of all registered service workers, each one of them is associated with the pushManager API.

created(){
  navigator.serviceWorker.getRegistration().then(registration => {
    registration.pushManager.getSubscription()
     .then(function(subscription) {
  ...
}

Upvotes: 2

Related Questions