Web Push - размещение сервисного работника

100
13

Отсюда https://developers.google.com/web/fundamentals/getting-started/primers/service-workers

Если сервисный работник находится в корне домена, это означает, что область рабочего обслуживающего персонала будет всем источником. Но если мы зарегистрируем файл рабочего сотрудника в /example/sw.js, тогда рабочий службы будет видеть только события выборки для страниц, URL которых начинается с/example/(т.е./example/page1/,/example/page2/).

Второй пункт упоминает, что только выборка не будет работать в/(корень или другой пример), если я поместил сервисного работника в /example/.

Но подписка (генерация субобъекта) сама по себе не создается, если работник службы находится в/пример/, и если веб-страница находится в/(корень или другой пример), который документ явно не объясняет.

Пожалуйста, дайте мне знать, если даже генерация подписки (pushManager.getSubscription) у самого работника службы не произойдет.

PS: Я пробовал это на Chrome 54.0.2840.100 Ubuntu 16.04 LTS

спросил(а) 2021-01-25T15:43:18+03:00 4 месяца, 3 недели назад
1
Решение
134

Генерация объекта подписки не зависит от сферы обслуживания. Вы можете сделать это где угодно

Например. permission.js

export function allowNotifications(scope){
if (navigator.serviceWorker && Notification){
if( Notification.permission !== "granted") {
navigator.serviceWorker.ready.then(function(reg) {
subscribe(reg);
});
}
}
}

function subscribe(reg) {
reg.pushManager.subscribe({userVisibleOnly: true}).then(function(pushSubscription) {
bindUserToDevice(JSON.stringify(pushSubscription));
}, function (err) {
console.log('error');
});
}

export function bindUserToDevice(subscriptionObj) {

// received subsciption object should be send to backend to bind the device for pushes
var data = {
type: 'POST',
url : '/bind',
body: subscriptionObj,
};
fetch('/bind', data);

}

Функция allowNotifications может быть вызвана из любого места. В корне должен присутствовать только файл рабочего пользователя, который должен иметь push- событие

 global.addEventListener('push', function(event) {
var pushObj = event.data.json();
var pushData = pushObj.data;

var title = pushData && pushData.title;
var body = pushData && pushData.body;
var icon = '/img/logo.png';

event.waitUntil(global.registration.showNotification(title, {
body: body,
icon: icon,
data:pushData
}));
});

ответил(а) 2021-01-25T15:43:18+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема