Просьба принять уведомления при первом посещении сайта - PullRequest
0 голосов
/ 23 января 2019

У меня проблема с push-уведомлением.При первом посещении моего сайта браузер пользователя не запрашивает подтверждения уведомлений.Только второе обновление страницы вызывает запрос на подтверждение уведомления.Я заметил, что при первом посещении в браузере пользователя сохраняется только работник службы.

Кто-нибудь знает, почему это происходит?Вот мой код
sw.js:

    'use strict';

self.addEventListener('message', function(event){
    var data = JSON.parse(event.data);
    self.userID = data.uid;
    self.notificationDataUrl = data.notificationDataUrl;
});

self.addEventListener('push', function(event) {
    event.waitUntil(
        fetch(notificationDataUrl+userID).then(function(response) {
            if (response.status !== 200) {
                throw new Error();
            }
            return response.json().then(function(data) {
                if (data.error) {
                    throw new Error();
                }
                const title = data['title'];
                const options = {
                    body:  data['body'],
                    icon: data['icon'],
                    badge: data['badge']
                };

                return self.registration.showNotification(title, options);
            });
        })
    );
});

self.addEventListener('notificationclick', function(event) {
    event.notification.close();
    event.waitUntil(
        fetch(notificationDataUrl+userID).then(function(response) {
            if (response.status !== 200) {
                throw new Error();
            }
            return response.json().then(function(data) {
                if (data.error) {
                    throw new Error();
                }
                clients.openWindow(data['link'])
            });
        })
    );
});

и main.js:

 'use strict';

const applicationServerPublicKey = 'xyz';

let swRegistration = null;

function urlB64ToUint8Array(base64String) {
  const padding = '='.repeat((4 - base64String.length % 4) % 4);
  const base64 = (base64String + padding)
    .replace(/\-/g, '+')
    .replace(/_/g, '/');

  const rawData = window.atob(base64);
  const outputArray = new Uint8Array(rawData.length);

  for (let i = 0; i < rawData.length; ++i) {
    outputArray[i] = rawData.charCodeAt(i);
  }
  return outputArray;
}

if ('serviceWorker' in navigator && 'PushManager' in window) {
  navigator.serviceWorker.register('../../../../js/sw.js')
      .then(function(swReg) {
        swRegistration = swReg;
        initializeUI();
      })
      .catch(function(error) {
          console.log("Service Worker Failed to Register", error);
      });
}

function initializeUI() {
    subscribeUser();
}

function subscribeUser() {
  const applicationServerKey = urlB64ToUint8Array(applicationServerPublicKey);
  swRegistration.pushManager.subscribe({
    userVisibleOnly: true,
    applicationServerKey: applicationServerKey
  })
      .then(function(subscription) {
          swRegistration.active.postMessage(JSON.stringify({uid: Data.user, notificationDataUrl: Data.notificationDataUrl}));
        return updateSubscriptionOnServer(subscription);
      })
      .catch(function(err) {
      });
}

function updateSubscriptionOnServer(subscription) {
    sendSubscription(subscription);
}

function sendSubscription(subscription) {
    return $.post(Urls.saveSubscription, {
        "subscriptionData": JSON.stringify(subscription),
        "redirectSlug": Data.redirectSlug,
        "group": Data.group,
        "city": '',
        'user': Data.user
    }).done(function(data, statusText, xhr) {
        window.location.replace(data['redirectUrl']);
    });
}
...