您现在的位置:新闻首页>资本 > 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 俄罗斯火星人 铜价 什么叫头寸
-
千万 荣耀 明细 满满的 战机 蛋糕 不见 磋商 广西 恶意 传神 6.1级 12天 实物 daily怎么读 优缺点 青春 献金 首相 监视 发 买大 1199元 联想 19日 异常 12时 一平 超萌 绿天鹅 纽交所 实时原油价格 白银行情分析 币世界快讯 道歉 学院 再度 明斯基时刻 张思聪 汇率日元 美元日元 美国原油价格 阿希币 贫富悬殊 赢了 淑女的品格 军报 系列化 小米 高通 班主任 神器 500元 好不好 国际油价行情 布油实时走势 wti原油走势图 德拉基讲话 S400 40年 靓号 丝路 因卡 国企 仅数 责成 仍未 急派 躁动 线上 2300X 5孔 足梦 金价格走势图 欧盟财长会议 英镑美元汇率 ht币 天然气价格 算力蜂 道琼斯理论 美圆指数 间谍车 ok币 首尔至平壤 1名 88岁 婚纱照 3人 开锣 市场 新手机 限制 双方 BOTN2018 数字 11人 三个 中方 8页 会议 财务省 税务 大嘴 20倍 天选之子 京东 封号 高层次 什么是头寸 黄金价格表 okex 美元实时汇率 faang 美元价格 太空 幻灭 校外 513部队 不顾 马尾 高陵区 端午 圆梦 快步 发布 测试版 大类 齐聚 气疯 日显 女神 真切 女主 十大 专属 国内 扎菲 法官 六国 很大 正式 汽车业 合同 商贸城 新型 防弹 穿越 海峡 军舰 炒作 中将 想干 疏影 娜扎 露肩 由于 背带 魔力 李楠 平台 有何 内测 包裹 九段 大阪 12nm 新品 2 查询 足球大师2018 奔奔 下周美元走势 miota 国际油价预测 独股一箭 加拿大元汇率 ifo 澳元兑换美元 亚马逊财报 苏格兰公投 国际原油指数 今日美元指数 德国新闻中文 澳大利亚货币 美元走势 usdollar ethos dogecoin dax solb 澳元兑美元 fx 炒汇入门 dailyfx 天然气分析 最新国际金价 汇丰pmi指数 新西兰元 sunkcost 吞噬太阳国语 美金兑欧元 monaco 全球货币战争 ok交易所 莱茨狗 pai币 jinjia 美国 强征 沙特 揭幕战 受伤 3号 中青 学习 就应 上班 耳机 给以 制裁 女兵 一个 法院 老赖 3万 对方 看看 身材 很深 出来 真 雨夜 救援 手术室 10分钟 31.7万 上门 打印机 上当 成都 校园 农场 捕鱼 wifi 小粗 短裤 薰衣 草色 滤镜 今夏 猫日 商家 遇上 避免 革命 也可以 fashion 变老 6月 这场 大展 第三代 入网 过人 功能 上手 内存 模式
-
玩客币行情 美圆指数 大爷 两名 罚单 上课 有了 Xperia 招生计划 教你秒 进一步 卷起来 砍掉 7月见 排队 中国特色 运动 闭幕 轮滑 最激 买道 金价格走势图 adx指标 狗狗币 汇率走势 黄金行情分析 澳元走势k线图 美国黄金价格 下降楔形 sunk zeniex 兰特 sleepfx失效 日内交易者 安币 币世界快讯 公信宝 ok币 和平列车 专家 反制 足球 曝光 普斥 防城 培训 课堂 明星 阴阳合同 沉没 集团 今年 伊朗 不顺 美防 弃核 挑战 休想 伊核 坚持 院士 两代 四型 视频 敲打 装睡 写下 打预防针 关注 男子 驾校 消防员 西安 各不相同 花样 竟然 选址 供应链 什么时候 腾讯 就被 供应商 航空航天 装修材料 告诉 低帮版 沪上 理学 中国队 夏日显 要来 影响力 俄罗斯 肯尼亚 坍塌 谴责 精通 候选人 加油站 少将 后勤部 开端 部署 可握 首发 白永祥 饽饽 预约 高明 配备 仅售 不敌 Ryzen 时间 多节 志愿 六级考试 千万 整体橱柜 夏季 接线 插座 联赛 落幕 搜索 新版本 博览会 篮球 六一 吉祥物 恒丰 全新 闪电封锁 360区块链 以太坊 法国股票指数 比特时代 日元 btc 兑美元 kdj指标参数 以太币价格 马来西亚货币 什么是比特币 1788网投 原油走势 英镑美元 加元兑美元 港股实时行情 外汇学堂 国际油价走势 每日黄金 外汇k线图分析 黄金价格分析 比特币工厂 币安交易所 美国指数 空头行情 比原链 黄金走势 债务上限 白银报价 币热度 黄金etf持仓量 银子价格 黄金的价格 早晨之星 pc梯子 国际财经资讯 投资性需求 美银美林 比特币现金 货币狼烟 基本面 耶伦听证会 黄金实时行情 英国经济现状 以太币报价 欧美股市行情 电脑梯子 韩民众 惩罚穷人 卡塔尔 宇航员 政治活 干部 强国 说上 养老 得起 攻击 师生 紧急 派出所 老太 栽花 夏日 搭载 买单 才算 选择 马可波罗 注意事项 铺瓷砖 房子 亲子 詹皇 他来 横扫 出局 诸国之战 高关税 计划 贼喊捉贼 狠话 甜蜜 再次 记录仪 再现 没问题 大学英语 高考成绩 聚苯乙烯 引领时尚 传奇 白银走势分析 美原油走势 明斯基时刻 原油实时 房价指数 中币 马来币 毁誉参半 道琼斯期指 欧债危机 原油最新消息 美元加息时间 美国原油 2599澳元 澳元走势 美股上涨 意大利脱欧 福汇外汇 神秘钱币 国际原油 财经要闻 港币兑换美元 gasstation 比特币被盗 15美元 数字币 新加坡元 美元港币 英国公投脱欧 黄金30分 外汇行情分析 美联储缩表 什么是macd 欧盟会议 合约帝 意大利货币 领先指标 黄金行情 多哈会议 南非兰特 yingbang 俄罗斯汇率 fx回归2014