Я использую 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,
};