如何在网络推送中向特定用户发送推送通知?

时间:2019-12-12 10:49:44

标签: node.js push-notification web-push

我有一个现有网站,我只需要向该网站推送通知, Nodejs Web-push程序包,我可以接收通知,但需要将其更改为特定于用户

例如,我想根据国家/地区向用户发送通知

这是我的代码

client.js

const publicVapidKey = 'xxxxxx';

if ('serviceWorker' in navigator) {
  console.log('Registering service worker');

  run().catch(error => console.error(error));
}
function urlBase64ToUint8Array(base64String) {
  const padding = '='.repeat((4 - base64String.length % 4) % 4);
  const base64 = (base64String + padding)
    .replace(/-/g, '+')
    .replace(/_/g, '/');

  const rawData = window.atob(base64);
  const outputArray = new Uint8Array(rawData.length);

  for (let i = 0; i < rawData.length; ++i) {
    outputArray[i] = rawData.charCodeAt(i);
  }
  return outputArray;
}

async function run() {
  console.log('Registering service worker');
  const registration = await navigator.serviceWorker.
    register('worker.js');
  console.log('Registered service worker');

  console.log('Registering push');
  const subscription = await registration.pushManager.
    subscribe({
      userVisibleOnly: true,
      // The `urlBase64ToUint8Array()` function is the same as in
      // https://www.npmjs.com/package/web-push#using-vapid-key-for-applicationserverkey
      applicationServerKey: urlBase64ToUint8Array(publicVapidKey)
    });
    // subscription.user = $('.header-user-name').find('span').text();
  console.log('Registered push');

  console.log('Sending push');
  await fetch('http://localhost:3000/subscribe?user='+$('.header-user-name').find('span').text(), {
    method: 'POST',
    body: JSON.stringify(subscription),
    headers: {
      'content-type': 'application/json'
    }
  });
  console.log('Sent push');
}

Worker.js

console.log('Loaded service worker!');

self.addEventListener('push', ev => {
  const data = ev.data.json();
  console.log('Got push', data);

  ev.waitUntil(self.registration.showNotification(data.title, {
    body: 'Hello, World!',
    registration_ids: [$('.header-user-name').find('span').text()]
    icon: 'http://mongoosejs.com/docs/images/mongoose5_62x30_transparent.png'
  }));

});

服务器代码(localhost:3000 / push)

app.get('/push',function(req,res) {

  const payload = JSON.stringify({ title: 'Hello '+ user.name +' ' + req.query.title,  });

  console.log(req.query);
  console.log("yahooooooooooooooooooooooooooooooooo");

  webpush.sendNotification(newSubscription, payload).catch(error => {
    console.error(error.stack);
  });
  res.send({result : 'Success'});
});

2 个答案:

答案 0 :(得分:0)

您可以使用ip-api.com之类的服务来使用用户的IP查找其国家/地区。获取国家/地区信息后,您可以将其与推送订阅对象一起包含在请求正文中,然后发送到后端。因此,您将有机会细分您的订阅者,并向他们发送具有不同内容的推送通知。

答案 1 :(得分:0)

经过长时间的间隔,我对此有了一个想法,

要遵循的步骤,

  1. 需要创建express api来将用户订阅存储在数据库中,
  2. 需要从数据库中获取基于国家/地区的用户(您可以选择您自己的后端语言,因为我选择了Nodejs)
  3. 然后创建一个可以使用给定参数(例如(国家/地区,用户等))发送推送通知的api

快乐编码