У меня проблема с 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']);
});
}