push-уведомление работника sw-precache не получено в первый раз в create-реагировать-приложение - PullRequest
0 голосов
/ 21 марта 2019

Я использую CRA и пытаюсь использовать пользовательский сервисный работник, используя sw-precache на производстве. Но не может отправить уведомление о получении даже после разрешения на это. И когда я перезагружаю страницу и снова разрешаю получать уведомления, я получаю уведомления. Это происходит, когда я впервые открываю свое веб-приложение в новом браузере / системе. Может ли кто-нибудь помочь мне с этим?

вот так выглядит мой пользовательский сервисный работник: (sw.js)


var url = '';
self.addEventListener('push', function(event) {
  if (!(self.Notification && self.Notification.permission === 'granted')) {
    return;
  }
  var matchingClient = null;
  url = '';
  event.waitUntil(
    self.clients
      .matchAll({
        type: 'window',
        includeUncontrolled: true,
      })
      .then(windowClients => {
        let data = {};
        if (event.data) {
          data = event.data.json();
        }
        url = data.action;
        for (let i = 0; i < windowClients.length; i++) {
          const windowClient = windowClients[i];
          if (windowClient.url === url && windowClient.focused === true) {
            matchingClient = url;
            break;
          }
        }
        if (!matchingClient) {
          return self.registration.showNotification(data.title, {
            body: data.body,
            icon: 'logo.png',
          });
        }
      }),
  );
});

self.addEventListener('notificationclick', function(event) {
  event.notification.close();
  var client = null;
  event.waitUntil(
    self.clients
      .matchAll({
        type: 'window',
        includeUncontrolled: true,
      })
      .then(windowClients => {
        for (let i = 0; i < windowClients.length; i++) {
          const windowClient = windowClients[i];
          if (windowClient.url === event.target.url) {
            client = windowClient;
            break;
          }
        }
        if (!client) {
          return self.clients.openWindow(event.target.url);
        } else {
          return client.focus();
        }
      }),
  );
});

это файл конфигурации sw-precache:

module.exports = {
  staticFileGlobs: ['build/static/css/**.css', 'build/static/js/**.js'],
  swFilePath: './build/service-worker.js',
  stripPrefix: 'build/',
  importScripts: ['./sw.js'],
  handleFetch: false,
};
...