Спасибо, я внедрил webpu sh в Ruby в Rails, но я не могу получать уведомления во второй раз в среде разработки, и я каждый раз отменяю регистрацию. Это правильное поведение?
service_worker. js .erb
var CACHE_VERSION = 'v1';
var CACHE_NAME = CACHE_VERSION + ':sw-cache-';
function onInstall(event) {
console.log('[Serviceworker]', "Installing!", event);
event.waitUntil(
caches.open(CACHE_NAME).then(function prefill(cache) {
return cache.addAll([
'<%#= asset_path "hoge.js" %>',
'<%= asset_path "hoge.css" %>',
'/offline.html',
]);
})
);
}
function onActivate(event) {
console.log('[Serviceworker]', "Activating!", event);
event.waitUntil(
caches.keys().then(function (cacheNames) {
return Promise.all(
cacheNames.filter(function (cacheName) {
return cacheName.indexOf(CACHE_VERSION) !== 0;
}).map(function (cacheName) {
return caches.delete(cacheName);
})
);
})
);
}
function onFetch(event) {
event.respondWith(
fetch(event.request).catch(function () {
return caches.match(event.request).then(function (response) {
if (response) {
return response;
}
if (event.request.mode === 'navigate' ||
(event.request.method === 'GET' && event.request.headers.get('accept').includes('text/html'))) {
console.log('[Serviceworker]', "Fetching offline content", event);
return caches.match('/offline.html');
}
})
})
);
}
self.addEventListener('install', onInstall);
self.addEventListener('activate', onActivate);
self.addEventListener('fetch', onFetch);
self.addEventListener('push', function (event) {
var title = (event.data && event.data.text()) || 'test push';
var data = {
body: "",
tag: "push-simple-demo-notification-tag",
icon: '/icon.png',
vibrate: [400, 100, 400],
data: {
link_to: '/'
}
};
event.waitUntil(self.registration.showNotification(title, data)
.then(
function (showEvent) { },
function (error) {
console.log(error);
}))
});
self.addEventListener("notificationclick", function (event) {
event.notification.close();
var link_to = event.notification.data.link_to;
event.waitUntil(clients.matchAll({
type: "window"
}).then(function (clientList) {
for (var i = 0; i < clientList.length; i++) {
var client = clientList[i];
var regexp = new RegExp(link_to + '$');
var match = client.url.match(regexp);
if (match != null && 'focus' in client)
return client.focus();
}
if (clients.openWindow) {
return clients.openWindow(link_to);
}
}));
});
Первое уведомление после отмены регистрации работает нормально. Второе уведомление никогда не может быть отправлено. Проверка обновления при перезагрузке в настройках chrome также не работала.