Angular Service workers、推送通知和订阅用户

Angular Service workers、推送通知和订阅用户,angular,service-worker,angular-service-worker,Angular,Service Worker,Angular Service Worker,我有一个大的内部角度项目。我们需要向用户发送关于工作中某些流程的通知。我在前端将项目更新为angular 8,我们使用Nodejs和Express作为后端。在主要时间里,一切都进展顺利。但是我有一个小挑战,就是我无法知道客户是否订阅了。我知道他没有订阅,我会显示一个取消订阅的按钮。所有订阅都保存在数据库中,但某些客户端已获得不同浏览器的多个订阅。那么,有没有办法知道用户是否从使用过的浏览器中订阅。感谢您的帮助 您需要一个唯一的id,您可以为每个用户引用该id,并可以跟踪订阅和触发通知 我将建议您

我有一个大的内部角度项目。我们需要向用户发送关于工作中某些流程的通知。我在前端将项目更新为angular 8,我们使用Nodejs和Express作为后端。在主要时间里,一切都进展顺利。但是我有一个小挑战,就是我无法知道客户是否订阅了。我知道他没有订阅,我会显示一个取消订阅的按钮。所有订阅都保存在数据库中,但某些客户端已获得不同浏览器的多个订阅。那么,有没有办法知道用户是否从使用过的浏览器中订阅。感谢您的帮助

您需要一个唯一的id,您可以为每个用户引用该id,并可以跟踪订阅和触发通知

我将建议您关注一些事情,并使其在不同的浏览器和设备之间具有独特性

使用此插件获取唯一的设备id

使用此选项并查找浏览器名称

getBrowserName() {

// @ts-ignore
let isOpera = (!!window.opr && !!opr.addons) || !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
if (isOpera) return 'isOpera';
// Firefox 1.0+
// @ts-ignore
let isFirefox = typeof InstallTrigger !== 'undefined';
if (isFirefox) return 'isFirefox';

 // Safari 3.0+ "[object HTMLElementConstructor]"
// @ts-ignore
let isSafari = /constructor/i.test(window.HTMLElement) || (function (p) {
  return p.toString() === "[object SafariRemoteNotification]";
  // @ts-ignore
})(!window['safari'] || (typeof safari !== 'undefined' && safari.pushNotification));

if (isSafari) return 'isSafari';

// Internet Explorer 6-11
// @ts-ignore
let isIE = /*@cc_on!@*/false || !!document.documentMode;
if (isIE) return isIE;

 // Edge 20+
// @ts-ignore
let isEdge = !isIE && !!window.StyleMedia;
if (isEdge) return 'isEdge';

// Chrome 1 - 71
// @ts-ignore
let isChrome = !!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime);
if (isChrome) return 'isChrome';

// Blink engine detection
// @ts-ignore
let isBlink = (isChrome || isOpera) && !!window.CSS;
if (isBlink) return 'isBlink';

}
现在,使用UUID和登录用户id标记浏览器名称。使用唯一id跟踪订阅,并向用户登录的所有浏览器和设备发送通知

<强>您需要考虑浏览器,因为UUID对于所有浏览器中的设备都是相同的。>/P> const uniqueId=uuid+getBrowserName()+logedInUserId


我想这应该会对您有所帮助。

您需要一个唯一的id,您可以为每个用户引用该id,并可以跟踪订阅和触发通知

我将建议您关注一些事情,并使其在不同的浏览器和设备之间具有独特性

使用此插件获取唯一的设备id

使用此选项并查找浏览器名称

getBrowserName() {

// @ts-ignore
let isOpera = (!!window.opr && !!opr.addons) || !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
if (isOpera) return 'isOpera';
// Firefox 1.0+
// @ts-ignore
let isFirefox = typeof InstallTrigger !== 'undefined';
if (isFirefox) return 'isFirefox';

 // Safari 3.0+ "[object HTMLElementConstructor]"
// @ts-ignore
let isSafari = /constructor/i.test(window.HTMLElement) || (function (p) {
  return p.toString() === "[object SafariRemoteNotification]";
  // @ts-ignore
})(!window['safari'] || (typeof safari !== 'undefined' && safari.pushNotification));

if (isSafari) return 'isSafari';

// Internet Explorer 6-11
// @ts-ignore
let isIE = /*@cc_on!@*/false || !!document.documentMode;
if (isIE) return isIE;

 // Edge 20+
// @ts-ignore
let isEdge = !isIE && !!window.StyleMedia;
if (isEdge) return 'isEdge';

// Chrome 1 - 71
// @ts-ignore
let isChrome = !!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime);
if (isChrome) return 'isChrome';

// Blink engine detection
// @ts-ignore
let isBlink = (isChrome || isOpera) && !!window.CSS;
if (isBlink) return 'isBlink';

}
现在,使用UUID和登录用户id标记浏览器名称。使用唯一id跟踪订阅,并向用户登录的所有浏览器和设备发送通知

<强>您需要考虑浏览器,因为UUID对于所有浏览器中的设备都是相同的。>/P> const uniqueId=uuid+getBrowserName()+logedInUserId


我想这应该对您有所帮助。

您需要一个设备uid来区分哪个用户订阅了哪些设备。在拥有所有订阅详细信息的数据库中,使设备uid与登录用户id保持一致。@sibabratswain正在这样做。如果有办法获取订阅端点,我可以比较每个设备的哪个变量。但是,由于用户不打算再次从同一设备订阅,因此很难获取端点。是否希望用户在其登录的所有设备中都获得通知?或者它将更新为最新登录,并使用登录的最新设备/浏览器获得一次通知?@sibabratswain是的,他将在同一设备内的任何设备和任何浏览器上收到通知。如果我们可以知道他是从他正在使用的浏览器订阅的,这将增加或增加功能,您需要一个设备uid来区分哪个用户订阅了哪些设备。在拥有所有订阅详细信息的数据库中,使设备uid与登录用户id保持一致。@sibabratswain正在这样做。如果有办法获取订阅端点,我可以比较每个设备的哪个变量。但是,由于用户不打算再次从同一设备订阅,因此很难获取端点。是否希望用户在其登录的所有设备中都获得通知?或者它将更新为最新登录,并使用登录的最新设备/浏览器获得一次通知?@sibabratswain是的,他将在同一设备内的任何设备和任何浏览器上收到通知。如果我们能知道他是从他正在使用的浏览器中订阅的,这将增加或增加其功能