Service Worker - push-уведомление с VAPID-ключами prv / pub - PullRequest
0 голосов
/ 16 мая 2018

Пару лет назад я реализовал 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.

1 Ответ

0 голосов
/ 19 мая 2018

Пробуйте то же самое предложение, опубликованное здесь: Web Push с VAPID: 400/401 Несанкционированная регистрация , теперь оно работает нормально. Я получаю регистрацию в браузере только один раз, а через 2 дня он все еще работает нормально

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...