Mathias26
Mathias26

Reputation: 79

Javascript service worker notification timeout

This is the first time I am working with serviceworkers and notifications.

I am trying to show a notification at a specified time. I tried doing it in the service worker as follows:

function showNotification() {
    setTimeout(function () {
        self.registration.showNotification('Title', {
            body: 'body blablabla',
            badge: 'assets/images/logo.jpeg',
            icon: 'assets/images/logo.jpeg',
            renotify: false,
            requireInteraction: true,
            silent: false,
            vibrate: [200, 100, 200],
            dir: 'ltr',
            lang: 'en-US'
        });
    }, 3000);

}

I don't get any notifications if I try this. When I delete the setTimeout function, I do get a notification so I assume it has something to do with the timeout. Is there another way or am I missing something?

Thanks!

Upvotes: 4

Views: 3103

Answers (1)

Philippe Sultan
Philippe Sultan

Reputation: 2378

Calling the function in my Chrome JavaScript function (outside of the Service Worker) actually works in my case, I tried it this way :

function showNotification() {
  navigator.serviceWorker.getRegistration().then(registration => {
    setTimeout(() => {
        registration.showNotification('Title', {
            body: 'body blablabla',
            badge: '/images/icon-light.png',
            icon: '/images/icon-light.png',
            renotify: false,
            requireInteraction: true,
            silent: false,
            vibrate: [200, 100, 200],
            dir: 'ltr',
            lang: 'en-US'
        });
    }, 3000);
  });
}

Calling showNotification from the SW works too, I just tried the following code along with the Applications -> Service Workers -> Push in the Chrome Devtools console button to send a Push notification and then display it after 3 seconds :

self.addEventListener('push', function(event) {
  if (event.data) {
    console.log('This push event has data: ', event.data.text());
  } else {
    console.log('This push event has no data.');
  }

  setTimeout(() => {
    self.registration.showNotification(
      'Title',
      {
        body: 'body blablabla',
        badge: '/images/icon-light.png',
        icon: '/images/icon-light.png',
        renotify: false,
        requireInteraction: true,
        silent: false,
        vibrate: [200, 100, 200],
        dir: 'ltr',
        lang: 'en-US'
      }
    ); 
  }, 3000);    
});

Hope this helps!

Upvotes: 4

Related Questions