使用Angular2实现Service Worker推送通知

6

我正在尝试整合使用service worker为用户提供推送通知的一般工作流程。

我已经按照thisGoogle开发者服务工作者推送通知教程,目前正在考虑如何在小型用户基础网络应用程序中实现此类功能以进行实验。

在我的理解中,支持推送通知的Web应用程序的一般工作流程如下:

  • 客户端访问应用
  • 服务工作者生成一个推送通知端点
  • 客户端将端点发送到服务器
  • 服务器将端点与当前生成端点的用户相关联
  • 每次发生应用程序可以说是值得通知的事情时,服务器会获取与用户关联的推送通知端点,并击中它以向任何用户设备发送推送通知(在Chrome 50+等中可能带有数据有效负载)

基本上,我只想确认我对这项技术的一般实现思路是否准确,否则如果我漏掉了什么,就获得反馈。


抱歉,不清楚您的问题是什么,请您重新表述一下哪里有疑惑或关注点?谢谢,Matt - Matt Gaunt
@GauntFace 抱歉!我为了更清晰地表达重新措辞了。我只是想看看我在应用程序中实现这个想法的想法是否准确,或者是否有更简单的方法来实现它。 - Dominic Farolino
1个回答

8
您的理解基本正确,但有些细节不太准确(但这主要是措辞问题,可能是个人喜好)。
  • 客户端访问应用程序
  • 注册要用于推送消息的服务工作者
  • 使用服务工作者注册来订阅用户以进行推送消息,在此时用户代理将配置一个端点+其他值以加密有效负载(如果用户代理支持)。
  • 客户端将端点发送到服务器
  • 服务器存储端点和数据以备后用(如果Web应用程序具有用户帐户,则服务器可以将端点与当前用户关联)。
  • 每当服务器希望向用户发送通知时,它会获取适当的端点并调用它们,这将唤醒服务工作者,服务工作者随后可以显示通知。

Chrome 50+即将支持有效负载,在撰写本文时Firefox已经支持有效负载,但在3个不同版本的Firefox中使用了3种不同的加密方式,因此在使用/依赖有效负载之前,建议等待有效负载支持情况得到完善。


谢谢!推送通知端点与特定服务工作者相关联,对吗?我困惑的一件事是,假设用户在两个不同的设备上加载站点(生成服务器保留的两个不同的推送通知端点)。假设有一个站点更新并注册了一个新的服务工作者(生成新的推送通知端点),现在用户在数据库中可能有4个与他们相关联的端点,但只有两个有效...这种模式继续下去,我们就会得到每个用户50个端点,只有几个是“最新的”...似乎容易泄漏大量信息。 - Dominic Farolino
似乎很难处理正确的端点,因为会生成一个新的端点。 - Dominic Farolino
关于此事有以下几点需要注意:
  • 用户代理不一定会在新的服务工作者上发布新的推送订阅(端点 +其他信息)
  • 当您使用推送订阅发送推送消息时,响应将告诉您订阅是否仍然有效 - 在这种情况下,您可以清除旧订阅
  • 如果它成为一个问题,可以使用类似于indexdb的东西来跟踪以前没有的订阅,并检测更改并删除新的旧推送订阅
- Matt Gaunt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接