PWA 实践经验 webpush

发布于 2022-02-25 14:02:02 字数 2445 浏览 1281 评论 0

webpush 也是 PWA 的一个十分关键的功能,推送背后的原理涉及三个实体: 客户端业务服务器google推送服务器(FCM)。相关资料可以参考我建好的一个 repo https://github.com/p2227/web-push-demo

数据流

结合我的 demo,一个推送(VAPID 形式)的数据流是这样子的

  • 业务服务器事先生成一对公私钥(VAPID),VAPID 需要持久化存储的,如果丢失,则会失去之前订阅的所有用户。重启服务器不需要重新生成 VAPID
  • 客户端检查是否已经订阅(serviceWorkerRegistration.pushManager.getSubscription()),如果没有,则向业务服务器获取公钥(第一次订阅时会提示需要显示通知的权限)。
  • 客户端把公钥作为参数,通过serviceWorkerRegistration.pushManager.subscribe()去跟 FCM 进行订阅,订阅成功获得 endpoint信息,这个信息的格式大概如下
{
  "endpoint": "https://fcm.googleapis.com/fcm/send/cqn7Z6-nFxI:APA91bEJIIwrR4M0jkv-K66hIveoHooRhXor42h39ku-m0SykHxxxxUg16CEpn0U3vM5UAFlSn9LfjXJPYpTYd2MzWBnCD_tgrJ509HvL08N2emFhw8-PI-azM2DubqHHuwCLhn-1D7TqFZCEHmtRs45z0X76g",
  "expirationTime": null,
  "keys": {
    "p256dh": "BBeeh1o0SbHbc7-LaQvxxxxnqkip4moubTx9KcBeUotXzcTBSWY1svXOPVM7Ew2W12JEOMBSgsezLUJn3v5E",
    "auth": "hiK1U5XwDUbTmxxxRtOow"
  }
}
  • 客户端 把 endpoint 信息发送给业务服务器存储,以后这个信息是发送订阅的唯一标记。
  • 业务服务器想发送推送时,会把endpoint信息和推送的内容发送给FCM,这时候客户端就会收到一个推送,触发推送事件,而这个推送要不要显示通知,由客户端sw的代码决定。
  • 如果 客户端 是安卓手机,则手机上需要安装google service framework,iPhone目前还没实现,但到时候推送服务器肯定会换成APNS之类的

推送的脑洞

一个推送除了传统地显示在客户端,吸引用户点击以外,还可以做更多的事情。结合 webpush,当一个推送到达客户端时,会触发 sw 的 push 事件,可以通过 event.data 获得具体推送的内容。想象一下如果你刚发完版,上线了新内容,则可以发送一条特殊的推送,这条推送可以让客户端后台静默更新资源(通过 postMessage 更新,sw不能直接操作dom),可以让客户直接更新到新的版本,或者可以缓存资源,让用户下次秒开你的新版本内容。知晓原理后慢慢打磨产品,推送的脑洞还是挻大的。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84959 人气
更多

推荐作者

lioqio

文章 0 评论 0

Single

文章 0 评论 0

禾厶谷欠

文章 0 评论 0

alipaysp_2zg8elfGgC

文章 0 评论 0

qq_N6d4X7

文章 0 评论 0

放低过去

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文