Пару лет назад я реализовал push-уведомление с сервисным работником в проекте, над которым я работал, зарегистрировав приложение в Firebase и используя регистрационный номер как часть файла manifest.json в приложении на стороне сервера.В этом случае я попросил пользователя разрешить уведомления, один раз зарегистрировал браузер, сохранил на стороне сервера, и все работает нормально.
Я сейчас пытаюсь реализовать подобное решение, но с использованием VAPID (https://developers.google.com/web/ilt/pwa/introduction-to-push-notifications#using_vapid). Браузер регистрируется правильно, отправляет регистрацию приложению на стороне сервера, и приложение может отправлять push-уведомления. Проблема, с которой я столкнулся, заключается в том, что по крайней мере через 24 часа, когда я пытаюсь отправить push-уведомление науже зарегистрированную подписку, я получаю ответ InvalidSubscription (410 NotRegistered). Используя VAPID, срок действия регистрации браузера истекает через несколько часов? Нужно ли мне получать новую регистрацию каждые определенное количество часов? Если да, то как? Например, если пользователь никогдаКак я могу продолжать отправлять им уведомления в течение дня или около того, как я могу продолжать отправлять им уведомления? Я не могу найти какой-либо четкой ссылки на эту проблему, с которой я сталкиваюсь.
Вот код JS, который я использую вSW для регистрации в браузере:
function postPushReg(sub){
var rawKey = sub.getKey ? sub.getKey('p256dh') : '';
var key = rawKey ?
btoa(String.fromCharCode.apply(null, new Uint8Array(rawKey))) :
'';
var rawAuthSecret = sub.getKey ? sub.getKey('auth') : '';
var authSecret = rawAuthSecret ?
btoa(String.fromCharCode.apply(null, new Uint8Array(rawAuthSecret))) :
'';
fetch('https://XXXXX', {
method: 'post',
headers: {'Content-type': 'application/json'},
body: JSON.stringify({endpoint: sub.endpoint, key: key, authSecret: authSecret}),
});
}
self.addEventListener('install', function(event){
self.registration.pushManager.getSubscription()
.then(function(sub){
if (sub) return postPushReg(sub);
return self.registration.pushManager.subscribe({userVisibleOnly: true,
applicationServerKey: urlB64ToUint8Array('XXX')})
.then(function(sub){
postPushReg(sub);
});
});
});
self.addEventListener('push', function(e){
...
});
Это сервер Rails / Ruby side gem (webpush) Я использую для отправки уведомления:
Webpush.payload_send(
message: "msg",
endpoint: j['endpoint'],
p256dh: j['key'],
auth: j['authSecret'],
vapid: {
subject: "mailto:XXXX",
public_key: "XXX",
private_key: "XXX",
}
)
Опять же, в течение первых нескольких часов все работает, затем я получаю 410 NotRegistered response.