您现在的位置:新闻首页>资本 > JavaScript关于Web推送通知的机制详解
JavaScript关于Web推送通知的机制详解
javascript栏目介绍Web推送通知的机制
(免费):javascript
推送通知在移动端非常常见。在 Web 端,尽管开发人员对其功能的需求很高,但出于某些原因,推送通知被引入 Web 的时间比较晚。
简介
Web 推送通知允许用户在 Web 应用程序需要更新时选择是否接收更新消息,目的是在重新吸引用户群注意的更新信息通常是对用户来说有趣、重要、实时的内容。
在这种情况下,使用 Service Worker 的原因是它们在后台工作。这对于推送通知非常有用,因为这意味着只有当用户与通知本身进行交互时,它们的代码才会被执行。
推送和通知
推送和通知都有各自的 API
推送 — 当服务器向 Service Worker 提供信息时调用它。通知 — 这是 Service Worker 或web应用程序中向用户显示信息的脚本的操作。推送 ( Push )
实现 Push 一般的三个步骤:
UI — 添加必要的客户端逻辑来订阅推送的用户。这是 Web 应用程序 UI 需要的 JavaScript 逻辑,以便用户能够自己注册来推送消息。发送推送通知 — 在服务器上实现 API 调用,该调用触发到用户设备的推送消息。接受推送消息 — 在推送消息到达浏览器时处理它。
接下来讨论更详细的过程。
浏览器支持检测
首先,我们需要检查当前浏览器是否支持推送消息,可以通过两个简单的检查来判断是否支持推送消息:
检查 navigator 对象上的 serviceWorker检查 window 对象上的 PushManager
代码如下:
注册 Service Worker
如果浏览器支持该功能,下一步骤就是注册 Service Worker。
如何注册 Service Worker,上一篇文章 JavaScript 是如何工作的:Service Worker 的生命周期及使用场景 里面就有讲过了。
请求许可
Service Worker 注册后,我们就可以开始订阅该用户。为此,我们需要得到用户的许可才能给用户发送推送消息。
获得权限的 API 相对简单,但是缺点是,API 已经 从回调更改为返回 Promise。这就引入了一个问题:我们不知道当前浏览器实现了 API 的哪个版本,因此必须同时实现和处理这两个版本,如下:
调用 Notification.requestpermission() 会在浏览器显示如下提示:
一旦权限被授予、关闭或阻塞,我们将会接收分别对应的一个字符串:granted、default 或 denied。
请记住,如果用户单击了 Block 按钮,你的 Web 应用程序将无法再次请求用户的权限,直到他们通过更改权限状态手动 “解除” 你的应用程序的权限,此选项隐藏在设置面板中。
使用 PushManager 订阅用户
一旦注册了 Service Worker 并获得了许可,就可以在注册 Service Worker 时通过调用registration.pushManager.subscribe() 订阅用户。
整个代码片段可如下(包括注册 Service Worker):
registration.pushManager.subscribe(options) 接受一个 options 对象,它包含必要参数和可选参数:
userVisibleOnly: 布尔值,表示返回的推送订阅将只能被用于对用户可见的消息。applicationServerKey:推送服务器用来向客户端应用发送消息的公钥。该值是应用程序服务器生成的签名密钥对的一部分,可使用在 P-256 曲线上实现的椭圆曲线数字签名(ECDSA)。可以是 DOMString 或 ArrayBuffer。
你的服务器需要生成一对 application server keys ——这些密钥也称为 VAPID 密钥,它们是服务器特有的。它们是一对公钥和私钥。私钥秘密存储在你的终端,而公钥则与客户端交换。这些键允许推送服务知道哪个应用服务器订阅了某个用户,并确保触发该用户的推送消息的服务器是同一台服务器。
你只需要为应用程序创建一次 私钥/公钥对,一种方法是访问 。
在订阅用户时,浏览器将 applicationServerKey(公共密钥)传递给推送服务,这意味着推送服务可以将应用程序的公共密钥绑定到用户的 PushSubscription 。
流程大概是这样的:
加载 Web 应用程序后,通过调用 subscribe()方法传递服务器密钥。浏览器向一个推送服务发出网络请求,该服务将生成一个端点,将该端点与密钥关联,并将该端点返回给浏览器。浏览器将把这个端点添加到 PushSubscription 对象中,该对象通过 返回 subscribe() 的 promise 得到 。
之后,只要你想推送消息,都需要创建一个 授权头(Authorization header),其中包含使用应用服务器的私钥签名的信息。当推送服务接收到发送推送消息的请求时,它将通过查找已链接到该特定端点的公钥(第二步)来验证消息头。
PushSubscription 对象
PushSubscription 对象包含向用户的设备发送推送消息所需的所有信息,如下:
{ "endpoint": "endpoint: 推送服务的 URL,要触发推送消息,post请求。keys: 该对象包含用于加密通过推送消息发送的消息数据的值。
一旦用户被订阅,并且你有了 PushSubscription 对象,就需要将其发送到服务器。在服务器上,你存对数据库的订阅,从现在开始使用它向该用户发送推送消息。
发送推送消息
当你想向用户发送推送消息时,首先需要的是推送服务。通过 API 调用告诉服务器你现在需要要发送什么数据、向谁发送消息以及关于如何发送消息的任何标准。通常,这个 API 调用是在服务器上完成的。
推送服务
推送服务是接收请求、验证请求并将推送消息发送到对应的浏览器。
请注意,推送服务不是由你管理的——它是一个第三方服务。你的服务器是通过 API 与 推送服务通信的服务器。推送服务的一个例子是 谷歌的FCM。
推送服务处理所有繁重的任务,比如,如果浏览器处于脱机状态,推送服务会在发送相应消息之前对消息进行排队,等待浏览器的再次联机。
每个浏览器都可以使用他们想要的任何推送服务,这是开发人员无法控制的。然而,所有的推送服务都有相同的 Api,所以这不会造成实现困难。
为了获得处理推送消息请求的 URL,需要检查 PushSubscription 对象中端点的存储值。
推送服务 API
推送服务 API 提供了一种向用户发送消息的方法。API 是 Web 协议,它是一个 IETF 标准,定义了如何对推送服务进行 API 调用。
使用推送消息发送的数据必须加密。这样,就可以阻止推送服务查看发送的数据。这一点很重要,因为浏览器决定使用哪个推送服务(它可能正在使用不受信任且不够安全的某个推送服务)。
对于每条推送消息,也可以给出如下说明:
TTL — 定义消息在删除和未发送之前应排队多长时间。优先级 — 定义每个消息的优先级,推送服务只发送高优先级的消息,确保用户因为一些突发情况关机或者断电等。主题 — 为推送消息提供一个主题名称,该名称将用相同的主题替换挂起的消息,这样,一旦设备处于活动状态,用户就不会收到过时的信息。
浏览器中的推送事件
一旦按照上面的解释将消息发送到推送服务,该消息将处于挂起状态,直到发生以下情况之一:
设备上线消息由于 TTL 而在队列上过期
当推送服务传递消息时,浏览器将接收它,解密它,并在的 Service Worker 中分派一个 push 事件。这里最重要的是,即使 Web 页面没有打开,浏览器也可以执行你的 Service Worker。流程如下:
推送消息到达浏览器,浏览器解密它浏览器唤醒 Service Workerpush 事件被分发给 Service Worker
设置推送事件监听器的代码应该与用 JavaScript 编写的任何其他事件监听器类似:
self.addEventListener('push', function(event) { if (event.data) { console.log('This push event has data: ', event.data.text()); } else { console.log('This push event has no data.'); } });
需要了解 Service Worker 的一点是,你没有 Service Worker 代码运行时长的控制权。浏览器决定何时将其唤醒以及何时终止它。
在 Service Worker 中,event.waitUntil(promise),告诉浏览器在该promse 未完成之前工作将一直进行中,如果它希望完成该工作,它不应该终止 Sercice Worker。
以下是一个处理 push 事件的例子:
self.addEventListener('push', function(event) { var promise = self.registration.showNotification('Push notification!'); event.waitUntil(promise); });
调用 self.registration.showNotification() 将向用户显示一个通知,并返回一个 promise,该 promise 在显示通知后将执行 resolve 方法。
showNotification(title, options) 方法可以根据需要进行可视化调整,title 参数是一个字符串,而参数 options 是一个对象,内容如下:
{ "//": "Visual Options", "body": "<String>", "icon": "<URL String>", "image": "<URL String>", "badge": "<URL String>", "vibrate": "<Array of Integers>", "sound": "<URL String>", "dir": "<String of 'auto' 'ltr' 'rtl'>", "//": "Behavioural Options", "tag": "<String>", "data": "<Anything>", "requireInteraction": "<boolean>", "renotify": "<Boolean>", "silent": "<Boolean>", "//": "Both Visual & Behavioural Options", "actions": "<Array of Strings>", "//": "Information Option. No visual affect.", "timestamp": "<Long>" }
可以了解更多的细节,每个选项在这里做什么-
当有紧急、重要和时间敏感的信息需要与用户分享时,推送通知是吸引用户注意力的好方法。
例如,我们在 SessionStack 计划利用推送通知让我们的用户知道他们的产品何时出现崩溃、问题或异常。这将让我们的用户立即知道发生了什么错误。然后,他们可以将问题作为视频回放,并利用我们的库收集的数据(如DOM更改、用户交互、网络请求、未处理的异常和调试消息)查看发生在最终用户身上的所有事情。
上一篇:操作系统是什么的接口?
下一篇:qlv是什么视频格式?
-
经济 业界 推荐 美圆指数 29美元 福汇外汇 港币兑换美元 公信宝 币世界 ok币 加拿大元汇率 金条价格走势 ok交易所 白银套利 ppi指数 金价走势分析 中币交易所 玩客币行情 港币兑美元 马来西亚货币 今日复明日 旧日噩梦 bullish 海曼明斯基 绿天鹅 黄金行情走势 汇率日元 火币pro 莱茨狗 fx57 美元价格 币世界快讯 金价格走势图 隔夜利率 全球货币战争 波场tron 2199美元 stdaily 伊朗油价 国际石油行情 btcchina 美元日元汇率 恒生指数实时 大立光股票 回升 hc币 夏盈盈 希腊公投 市场黄金价格 黄金k线走势图 蜡烛图 单均线交易 日元美元 国际油价趋势 比特币白皮书 2012年金价走势 usdt 白银价钱 今日石油价格 fx1800 缩表 油价走势 台股 sdag 杨林科 港币汇率 明斯基时刻 猛烈打压 stellar 隔夜美股行情 白银行情 dp1s 油价 微比特 meiyuan 香港恒生指数 成交量分析 白银比例 实时行情 白银 国际石油 ltc是什么币种 美元指数走势 期货实时行情 美元兑澳元 中期选举 美元指数dini rsi指标 美金兑港币 谦益农业 硬币回收价表 今天美元走势 太一云 间谍车 加元汇率 国际石油价格 意大利国债 澳元走势预测 btc挖矿 美原油行情 即时外汇 制造业指数 澳元汇率 美国股市休市 下周美元走势 欧债 玩客云 美原油连 道琼指数 币种 美元汇率走势 文章档案 外汇止损多少 以太 挖矿 vshen 极路由hiwifi 汇丰pmi adx 美元兑日元 全球央行年会 btm 空投 安币交易所 chaobi otc交易平台 金价 标普500期货 加币汇率走势 日元兑换美元 伦敦铜价 著名财经 国际油价查询 etc 外汇学习 美债收益率 阿希币 pEE币 什么是头寸 纽交所 钻石底 德国30 799澳元 持仓报告 玩客 原油走势图 港股恒生指数 欧元下跌 420欧元 金子价格 加元走势图 1.11111E+11 xrp 美元指数k线图 金价走势预测 最新黄金价格 铜价格走势图 黄金降价 汇率欧元 金针探底 原油成本 美元 strllar 泰奇猫 圈牌 金价走势 以太币 lme铜实时行情 eos价格走势 欧元兑美金 外汇基本知识 联邦基金利率 伦敦银走势图 基本面分析 空头回补 云鱼 py6是什么货币 rsi指标详解 265万澳元 国际油价格 gateio wti原油走势图 门罗币 白银价格走势 欧盟财长会议 外汇咨询 交叉盘 外汇初学 房价指数 cbt 比特股 ltc 隐私政策 石油危机 日圆汇率 英国股市指数 原油最新价格 行情报价 自动减支 黄金市场价 全球指数 imtoken 币投资 10美金 eos币价格 相对强弱指标 黄金年走势图 美原油 加元美元 虚拟币 值多少钱 国际油价 外汇哈里森 外汇交易分析 白银价格分析 日bi btcc 标准普尔500 wti原油价格 zbcom 和币 度宇宙 技术指标分析 全球股市指数 币久 白银价格趋势 克龙 银行回收硬币 hiwifi 贝尔链 美元兑换欧元 后座议员 黄金市场行情 德拉基讲话 UES 道琼斯k线图 美元对日元 k线图分析 恒生指数 英国脱欧时间 港股指数 比特币之父 bin 今日原油 jinjia 日经225指数 比特币价格 英镑汇率 742 大立光 外汇走势 上吊线 趣步APP被调查 肖野 理财三 铜走势图 艾达 吞阳 coinex 欧元美金 赵长鹏 法郎汇率 9g游戏 英国脱欧结果 硅谷bbs 俄罗斯火星人 铜价 什么叫头寸
-
放学 朋友 k线图解读 招生 仅数 金价走势分析 隔夜利率 投资性需求 比特币交易 btc行情 货币狼烟 美国国债利率 29美元 当天 游戏 创造 违法 市场黄金价格 美国原油 伊朗油价 欧盟会议 港元兑美元 蝴蝶币 纽币汇率 非美货币 顾比均线 港元汇率 日内交易者 港币美元汇率 白银对冲套利 英格兰银行 美伊关系 外汇止损多少 币世界快讯 中币交易所 获赔 鲜 坍塌 希腊公投 xunleiyun 关于黄金交易 欧元走势 标准普尔500 极路由hiwifi 日圆汇率 国际油价趋势 空投 ok交易所 推荐 用户 总决赛 开业 好酒 经济 英文 猛烈打压 2199美元 兑美元 什么是头寸 20日元 石油走势 dragon 欧美黄金 南非兰特 瑞波币 引而不发 sleepfx失效 27亿美金 黄金etf是什么 台湾股票查询 恒生指数 恒生指数实时 fx57 谦益农业 播控云 以为 一层 猫日 揭秘 慈善 关键 青年 75人 美国总统 退出 财务省 效率 攻坚战 姐姐 客户端 网售 国际石油 绿天鹅 黄金k线走势图 白银价格趋势 张思聪 港币汇率 马来币 国际油价查询 金条价格走势 上升楔形 欧债 2599澳元 一级市场 威比特 美联储缩表 19929日元 德国股票指数 bkex 美国油价 港币兑换 铜期货 日经225 美元最近走势 wti原油价格 外汇走势 港股指数 比特币价格 持仓报告 美元指数k线图 制造业指数 即时外汇 白银价格走势 吞阳 比特币之父 国际石油价格 hc币 otc交易平台 阿希币 2012年金价走势 今日复明日 ok币 糖果空投 贫富悬殊 提问 513部队 开建 四型 沦丧 师生 老赖 消防员 打印机 宽松 联手 火锅 提高 中考 考场 灵魂 依法 房屋 电线 匹克 秦岭 进一步 骑行 这么 瘦领型 半裙 连接 突尼斯 送医 多门 汽车业 达州 连衣裙 由于 将于 千万 好不好 行业 体育用品 下周美元走势 国际油价 以太坊 stdaily 今天美元走势 法国cac 加拿大元汇率 著名财经 印度卢比 bullish 传产 挖比特币 澳元兑美元 环球股指汇总 黄金白银价格 外汇交易策略 加拿大元走势 美金对港币 台湾加权指数 道琼斯工业 日元美元汇率 zbcom 欧洲峰会 技术指标分析 欧元美金 美元兑换欧元 265万澳元 相对强弱指标 理财三 俄罗斯火星人 标普500期货 外汇交易分析 美原油连 10美金 美元兑日元 虚拟币 艾达 币种 加元汇率 美元价格 中期选举 成交量分析 国际油价格 云鱼 strllar 油价走势 最新黄金价格 泰奇猫 美元兑澳元 杨林科 全球货币战争 sdag 以太 安币交易所 加币汇率走势 美元日元汇率 间谍车 玩客云 硬币回收价表 美国股市休市 币世界 墨西哥 律师 野蛮生长 微博 副市长 罪证 协商 最高 多好 妻子 真 手术室 欧冠 扰民 热情 两男 成都 刷屏 21600 模式 摄像头 代人 根据 更要 精神 顺序 家装 质量 更好 齐聚 上海 代言人 在的 情缘
-
朋友 ok交易所 港币兑美元 绿天鹅 美元兑日元 业界 希腊公投 海曼明斯基 dp1s 波场tron 推荐 汇率日元 恒生指数实时 29美元 2199美元 ppi指数 加拿大元汇率 美元指数k线图 2012年金价走势 仅数 极路由hiwifi fx57 今日复明日 ok币 jinjia 513部队 火锅 隔夜利率 玩客币行情 火币pro 美圆指数 币世界 攻坚战 经济 印度卢比 币世界快讯 明细 金价格走势图 金条价格走势 俄罗斯火星人 黄金k线走势图 钻石底 有限公司 发表声明 stdaily 港币兑换美元 你吗 回升 下周美元走势 市场黄金价格 fx1800 国际石油价格 杨林科 玩客云 1199元 金价走势分析 白银价格趋势 外汇趋势分析 12334 即时外汇牌价 原油最新价格 btc挖矿 meiyuan 美原油行情 19929日元 持仓报告 道琼指数 油价走势 空投 3号 宽松 首登 日本 效率 体育用品 蜡烛图 意大利国债 福汇外汇 fx 比特币挖矿机 缩表 美元日元汇率 间谍车 谦益农业 莱茨狗 微比特 鲜 创造 关于黄金交易 w底形态 门罗币 香港恒生指数 安币交易所 永久 3人 匹克 突尼斯 今日石油价格 bullish 瑞士货币 铜价 zbcom 圈牌 美原油连 日圆汇率 otc交易平台 当天 老赖 成鬼 处去 对比 财务省 今天美元走势 著名财经 欧债 今日恒生指数 白银价格分析 coinex 后座议员 外汇走势 btcc 外汇止损多少 比特币白皮书 外汇学习 英国股市指数 币种 中币交易所 最新黄金价格 全球货币战争 hc币 完全 胳膊 29日 查询 白银 房价指数 国际石油行情 美国国债利率 火币比特币 全球股市指数 基本面分析 金价 日元美元 btcchina 军事 强国 罪证 40年 交警 用户 发布 着力点 大立光股票 港币汇率 gasstation g7集团 pEE币 黄金年走势图 美国股市休市 金子价格 驱逐舰 靓号 驾校 救援 搭载 代人 他来 普爱 国企 核实 姐姐 班主任 包括 行情报价 黄金行情走势 隔夜美股行情 白银价钱 伊朗油价 拜登大胜 黄金etf是什么 wti原油价格 黄金市场行情 德国30 伦敦银走势图 联邦基金利率 欧元兑美金 10美金 原油走势图 vshen cbt 美元指数走势 usdt 阿希币 草色 fashion 腾讯 怎样 顺序 慈善 又放 明斯基时刻 单均线交易 汇率欧元 什么是头寸 白银套利 2599澳元 股市行情图 原油成本 eos币价格 外汇咨询 英国脱欧时间 金价走势预测 hiwifi 值多少钱 制造业指数 澳元走势预测 以太 国际油价趋势 硬币回收价表 美元 总决赛 打我 网售 汇丰pmi 白银行情 今日日历 外汇交易头寸 标准普尔500 欧元下跌 恒生指数 外汇交易分析 成交量分析 国际油价格 空头回补 泰奇猫 太一云 公信宝 福州 获赔 地方 青年 多门 一条 Find 京东 千万 外汇哈里森 国际油价 猛烈打压 自动减支 美金兑港币 白银比例 欧盟财长会议 美元汇率走势 eos什么意思 瑞士法郎汇率 k线图解读 742 技术指标分析 欧元美金 道琼斯k线图 265万澳元 理财三 日bi 伦敦铜价 美元指数dini 即时外汇 虚拟币







