前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Service Worker 实现 web 应用消息推送

Service Worker 实现 web 应用消息推送

作者头像
Fred Liang
发布于 2018-10-18 03:21:33
发布于 2018-10-18 03:21:33
2.5K00
代码可运行
举报
文章被收录于专栏:Fred LiangFred Liang
运行总次数:0
代码可运行

网站:https://www.fredliang.cn Github: https://github.com/fredliang44/fredliang.cn(暂未开源)

1. Service Worker 介绍

Service Worker 是事件驱动的 worker,生命周期与页面无关,关联页面未关闭时,它也可以退出,没有关联页面时,它也可以启动.

service worker 则是为解决“Web App 的用户体验不如 Native App”的普遍问题而提供的一系列技术集合,必然部分处理逻辑会牵扯到 UI 线程,从而在启动 service worker 的时候,UI 线程的繁忙也会影响其启动性能。

1.1 丰富的离线体验

首先,一提到 service worker,很多人都会想到离线访问,而且不少文章都会提到,service worker 能提供丰富的离线体验,但实际情况来说,需要离线访问的场景很少,毕竟 web 最大的特点在于可传播性,所以 service worker 的离线体验主要还是在于解决页面加载的可靠性,让用户能够完整地打开整个页面,比如页面的白屏时间过长,网络不稳定造成的加载中断导致页面不可用。

有实际意义的离线,一般不是指断开网络能访问,而是指在用户想访问之前,能提前把资源加载回来。离线并不是一直都断开网络,而是在网络连接良好的情况下,能把需要的资源都加载回来。一些比较糟糕的做法是在 WIFI 网络下把整个 App 客户端的资源都拉下来,这样其实很多资源是用户不需要的,浪费了用户的网络和存储。Service worker 提供了更好更丰富的离线技术,Push / Fetch / Cache 这些技术的结合,能够提供非常完美的离线体验。比如,在小程序页面发版时,推送消息给客户端,客户端唤起页面的 service worker,去将需要用到的资源提前加载回来。

1.2. 消息推送通知

Service worker 的消息推送,其实是提供了一种服务器与页面交互的技术。消息推送在 Native App 或 Hybird App 已经比较常见。很多 Hybird App 里面其实还会有一些 H5 页面,在没有实现 service worker 消息推送之前,消息是推送不到页面的。消息能推送到页面,意味着页面提前知道要发生的一些事情,把这些事情做好,比如,提前准备好页面需要的资源。Push 的推送服务器,Chromium 默认使用 GCM / FCM,在国内都不能访问,无法使用。浏览器厂商自己搭建 Push 服务器,成本也不低,目前国内还未有浏览器厂商支持标准的Push 服务。从 API 的使用规范来看,消息推送与通知弹窗的关联比较密切,基本上使用的业务场景仅限制在消息通知范围。

1.3. 管理资源缓存

浏览器提供了很多存储相关的 H5 API,比如 application cache、localStorage,但都不是非常好用,主要是给予页端的控制权太少,限制太多,页端不能完全控制每一个资源请求的存储逻辑,或多或少会有一些趟不过的坑。Service worker Cache API 的出现彻底改变了这一局面,赋予了页端强大的灵活性,更大的存储空间。如何灵活地控制缓存,可以参考 Google 官方文章 《The Offline Cookbook》。

1.4. 网络请求

在 Fetch 出现之前,页面 JS 一般通过 XHR 发起网络资源请求,但 XHR 有一定的局限性,比如,它不像普通请求那样支持 Request 和 Response 对象,也不支持 streaming response,一些跨域的场景也限制较多。而现在,Fetch API 支持 Request 和 Response 对象,也支持 streaming response,Foreign Fetch 还具备跨域的能力。

一般来说,基于 webview 的客户端拦截网络请求,都会基于 WebViewClient 的标准的 shouldInterceptRequest 接口。那么 service worker 的请求在 webview 还能不能拦截呢?WebViewClient 的标准的 shouldInterceptRequest 接口是拦截不了 service worker 的请求了,但 Chrome 49.0 提供了新的 ServiceWorkerController 可以拦截所有 service worker 的请求。另外,页端 JS 可以监听 Fetch 事件,通过 FetchEvent.respondWith 返回符合期望的 Response,即页端也能拦截 Response。

2. 状态管理

Service worker 有两类状态,一类是 service worker 线程的运行状态,另一类是 service worker 脚本版本的状态。

  1. Service worker 线程的运行状态, 一般对应 service worker 线程的状态,这类状态只保存在内存中。

STOPPED:已停止,EmbeddedWorkerInstance::OnStopped 时设置。 STARTING:正在启动,EmbeddedWorkerInstance::Start 时设置。 RUNNING:正在运行,EmbeddedWorkerInstance::OnStarted 时设置。 STOPPING:正在停止,EmbeddedWorkerInstance::Stop

3. service-worker.js

3.1 Work Box

通过 webpack4 引用 Google官方 workbox 文档:https://developers.google.com/web/tools/workbox/

以下为 vue-cli3 的 pwa 部分的配置文件,详细关注 workboxPluginModeworkboxOptions 配置

文档:https://developers.google.com

workboxPluginMode 有两个选项:

  • GenerateSW 会生成默认的 service worke 文件并且注入相应配置到 webpack pipline, 适合简单的配置需求
  • InjectManifest插件将生成一个预先缓存的URL列表,并将该预先缓存清单添加到现有的服务工作文件中,之后开发者可以注入自己的配置
3.1.1 以下为 GenerateSW 样例文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Inside of webpack.config.js:
// example for GenerateSW

const {GenerateSW} = require('workbox-webpack-plugin');

module.exports = {
  // Other webpack config...
  plugins: [
    // Other plugins...
    new GenerateSW()
  ]
};
3.1.2 以下为 InjectManifest 样例文件

必须在下方 {option: 'value'} 处指定 swSrc字段, 即为开发者手动注入的 service worker 文件

如:{swSrc: 'src/service-worker.js'}

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Inside of webpack.config.js:
// example for InjectManifest

const {InjectManifest} = require('workbox-webpack-plugin');

module.exports = {
  // Other webpack config...
  plugins: [
    // Other plugins...
    new InjectManifest({option: 'value'})
  ]
};

4. 个人博客案例:fredliang.cn

4.1 InjectManifest 默认注入的部分(使用打包到本地的 workbox 库)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// dist/service-worker.js
importScripts("/precache-manifest.af203becffbeaafe01097d88c1c3b001.js", "/workbox-v3.6.2/workbox-sw.js");
workbox.setConfig({modulePathPrefix: "/workbox-v3.6.2"});

4.2 人工配置的文件部分

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// continue
// dist/service-worker.js

workbox.core.setCacheNameDetails({prefix: "personal-website"});

workbox.skipWaiting();
workbox.clientsClaim();

/**
 * The workboxSW.precacheAndRoute() method efficiently caches and responds to
 * requests for URLs in the manifest.
 * See https://goo.gl/S9QRab
 */
self.__precacheManifest = [].concat(self.__precacheManifest || []);
workbox.precaching.suppressWarnings();
workbox.precaching.precacheAndRoute(self.__precacheManifest, {});


// html的缓存策略
workbox.routing.registerRoute(
  new RegExp('.*\.(?:html|json)'),
  workbox.strategies.networkFirst()
);

workbox.routing.registerRoute(
  new RegExp('.*\.(?:js|css)'),
  workbox.strategies.cacheFirst()
);

workbox.routing.registerRoute(
  new RegExp('https://stroage\.fredliang.\.cn/'),
  workbox.strategies.staleWhileRevalidate()
);

self.addEventListener('install', function(event){
  console.log('installed!');
})

self.addEventListener('activate', function(event){
  console.log('activated!');
});

self.addEventListener('message', function(event){
  console.log("SW Received Message: " + event.data);
});

以下为监听 webpush 行为部分

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// handle webpush event
self.addEventListener('push', function(event) {
  const pushInfoPromise = fetch('https://open.fredliang.cn/blog/visitor')
    .then(function(response) {
      return response.json();
    })
    .then(function(response) {
      const title = 'Message from Fred Liang'
      const options = {
        body: 'currently ' + response.data + ' visitors',
        icon: '/img/icons/icon-128x128.png',
        renotify: true,
        actions: [],
        url: 'https://www.fredliang.cn/',
        tag: 'renotify'
      }

      return self.registration.showNotification(title, options);
    });

  const promiseChain = Promise.all([
    pushInfoPromise
  ]);

  event.waitUntil(promiseChain);
});

// handle notification close
self.addEventListener('notificationclose', function(event) {
  const dismissedNotification = event.notification;
  const promiseChain = console.log('notificationclose');
  event.waitUntil(promiseChain);
});
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
浮华热潮正在消退 人工智能还能走多远?丨科技云·视角
2017年,围绕人工智能的巨头投资、创业押注不绝于耳,融资额度不断刷新纪录。但无论是图像、语言交互,还是算法、机器学习都不足以与实际场景结合,如何落地应用成为最大难题。另一方面,越来越多新技术、新概念的出现,开始让人工智能逐渐遇冷。2017下半年,随着比特币大涨,其底层技术区块链成功抢占人工智能的舞台,几乎占据了投资人、媒体人的朋友圈。
科技云报道
2022/04/14
2730
浮华热潮正在消退 人工智能还能走多远?丨科技云·视角
智能家居虽然前景看好,但如何甩掉人为干预才是其落地关键
虽然实现了概念的落地,但智能家居似乎还不够“智能”。 早前,在一些影视剧以及现实的家庭场景中,我们有时会在其中的玄关处或其他地方的墙面上看见一个类似于iPad的屏幕,上面或是相关数据、图谱,或是一些按键。通过它,用户可以对家里的情况一目了然,也可以对部分家电设进行控制,这就是早期的“智能家居”场景。 据前瞻产业研究院此前发布的《中国智能家居设备行业市场前瞻与投资策略规划报告》数据显示,2016年,我国智能家居市场规模达605.7亿元,同比增长率50.15%。预计未来几年内智能家居将迎来爆发,到2018年,智
镁客网
2018/05/28
4160
智能家居如火如荼,各玩家的第一步棋都下在哪里?
要进入一个领域,选择一个好的切入点是件很严肃的问题。 家庭服务机器人、智能音箱、智能电视……伴随着人工智能技术的提升以及市场的扩大,一些智能设备逐渐进入人们的家居生活中,在便利之外,也带来了一丝乐趣。 据前瞻产业研究院此前发布的《中国智能家居设备行业市场前瞻与投资策略规划报告》数据显示,2016年,我国智能家居市场规模达605.7亿元,同比增长率50.15%。预计未来几年内智能家居将迎来爆发,到2018年,智能家居市场规模将达1396亿元。另外,来自科尔尼管理咨询公司的最新报告预计,到2020年全球智能家居
镁客网
2018/05/29
4160
智头条|欧盟达成《人工智能法》协议,全球前沿科技齐聚AWE 2023,三年后中国智能家居市场规模有望达453亿美元
华为云宣布启动“‘百城万企’应用现代化中国行”,旨在推动应用现代化进程、助力数字中国高质量落地。软通动力是该行动的参与者之一,共同探索符合区域特点、产业趋势、政企现状的数字化方案,帮助企业实现降本增效、构建长期竞争力。软通动力是首批加入华为云“应用现代化产业联盟”的企业,依托咨询、云原生、大数据、AI+RPA、安全5大专家服务,助力客户高效实现现代化架构升级。
智哪儿
2023/05/05
3480
智头条|欧盟达成《人工智能法》协议,全球前沿科技齐聚AWE 2023,三年后中国智能家居市场规模有望达453亿美元
2018年至2010年,国家政策表明要推动人工智能领域发展
人工智能的秘密
2017/12/20
1.6K0
声纹识别技术:安全指数更高但其发展仍面临重重阻碍
在众多生物识别技术中,除了早已使用多年的指纹识别、虹膜识别,近期兴起的人脸识别技术被用于公司打卡、软件系统登录、家庭或公共场所的安防等多个场景,而语音识别技术的用途更是广泛,机器人、智能家居产品、无人车等等。 随着相关算法的精进,以上生物识别技术的准确率已经可以与人类相媲美。而在这些识别技术愈加成熟之时,越来越多的人将目光放在另外一种生物识别技术上——声纹识别。 什么是声纹识别技术? 声纹识别,也称作说话人识别,是一种通过声音判别说话人身份的技术。人在讲话时使用的发声器官舌、牙齿、喉头、肺、鼻腔在尺寸和形态
镁客网
2018/05/29
1.8K0
2016年人工智能产业梳理:一朝引爆,稳步前进(中篇)
在基础层、应用层、软件和媒体四个人工智能产业划分中,在技术之外,应用层更多关注的是用户的需求。基于用户的需求,将产品与人工智能技术相糅合,才能让技术和产品得到“落地”,而不是如同“鸡肋”。 在应用层方
镁客网
2018/05/29
5030
图像识别落地B端应用,商业化的“绣球”先抛给了哪些行业?
随着技术进入成熟期,在最容易实现落地的B端市场,图像识别正逐渐扩大自己的市场。 近日,美国权威杂志《MIT科技评论》(MIT Technology Review)公布了2017年度全球十大突破技术,其中属于AI范畴有三项技术,分别是强化学习、自动驾驶货车和刷脸支付。 其中,值得我们注意的是,虽然同属于2017年的突破性技术,但在距离进入成熟期的时间上,相对于强化学习和自动驾驶货车的还需要1-2年和5-10年时间,刷脸支付技术现在就已经进入了这一阶段。 根据平安证券发布的《通信行业人工智能图像识别专题报告》显
镁客网
2018/05/28
7160
【研报】全球智能语音市场将达200亿美元,进入群雄纷争时代
【新智元导读】国际知名市场研究公司Research and Markets 2016年5月4日发布报告《全球及中国语音产业报告,2015-2020》的修订版本。报告认为,随着语音在智能产业的应用不断加深,全球,以及中国的语音市场在接下来的5年当中仍将维持显著地增长,到2020年,全球语音市场规模预计将达到191.7亿美元。报告数据显示,尽管领头羊Nuance仍然占据着三成的市场份额,但是已经出现明显下滑趋势,其他科技巨头谷歌、微软、苹果和科大讯飞则获得了迅速的增长,全球市场份额分别为20.7%、13.4%、
新智元
2018/03/22
1.5K0
【研报】全球智能语音市场将达200亿美元,进入群雄纷争时代
浅析:智能家居缘何不温不火?
近日,欧洲最大软件商 SAP 决定拨款20亿欧元的专款投资物联网,用于投资开发从家居到汽车的智能化互联网接入设备。在这其中,智能家居应该算是当前发展速度较快的那一个领域,但是,作为一个需求庞大的国家,中国的智能家具产业却一直处在不温不火的状态。这其中的问题到底出在哪里? 中国智能家居还处于萌芽 我国人口基数巨大,也就意味着对于智能硬件有着很大的需求,而这其中包括了智能家居硬件产品。根据前瞻产业研究院提供的《中国智能家居设备行业发展前景预测与投资机会分析报告》指出,2012年我国智能家居市场规模为1022.2
镁客网
2018/05/28
6840
【盘点】巨头在人工智能市场的战略布局
导读:从市场披露的投资数据分析,在2011年到2015年的五年时间,人工智能领域的并购资金从2.82亿美元增长到2015年的23.88亿美元,而并购数量也从67起增长到397起。以谷歌、苹果、IBM、
钱塘数据
2018/03/01
1.1K0
【盘点】巨头在人工智能市场的战略布局
人工智能的十大应用
导读:人工智能已经逐渐走进我们的生活,并应用于各个领域,它不仅给许多行业带来了巨大的经济效益,也为我们的生活带来了许多改变和便利。下面,我们将分别介绍人工智能的一些主要应用场景。
IT阅读排行榜
2022/03/11
3.9K0
人工智能的十大应用
科大讯飞胡郁演讲实录:人工智能是这个时代最伟大的魔法师
唯物按:9月份锤子的发布会结束后,科大讯飞股票应声上涨,成为罗永浩相声专场的最大赢家。 这其中有一些运气的成分,但在这种运气之前,讯飞已经做了很多铺垫工作。科大讯飞在2014年就发布了中国的人工智能品
AI研习社
2018/03/29
9680
科大讯飞胡郁演讲实录:人工智能是这个时代最伟大的魔法师
数据解读:资本追逐的14个人工智能细分领域
摘要: 2014年后,人工智能逐渐成为中国私募市场的“宠儿”,投资风口也逐渐形成。亿欧智库最新推出的《2018中国人工智能投资市场研究报告》中,挖掘了14个行业中最受追捧的细分领域。
钱塘数据
2019/03/08
8980
数据解读:资本追逐的14个人工智能细分领域
左手握技术,右手握需求,但声纹识别依旧当不了“独行侠”
因为智能AI语音助手“小欧”的语音唤醒、解锁功能,用户花了5000元买了一部OPPO的手机。这事没让用户感到兴奋,反而有点恐慌。
镁客网
2018/12/05
9480
AI引领,语音识别技术有怎样的发展趋势?
语音识别是人工智能领域的一个重要方向,现在已逐渐发展为一个具有广阔前景的高新技术产业,许多企业在语音识别技术上潜精研思。例如,百度借助自己的人工智能生态平台,推出了智能行车助手CoDriver;科大讯飞与奇瑞等汽车制造商合作,推出了飞鱼汽车助理;搜狗与四维图新合作,推出了飞歌导航;云知声、思必驰在导航、平视显示器等车载应用方面推出了多款智能语控车载产品……在如今的语音技术市场中,大量产品被人们开发出来并运用到实处上,语音识别技术的发展前景如火如荼。
用户8858632
2021/11/12
5500
投融资汇总 | 本周(9.22-9.29)影谱科技获追加融资加固“最高纪录”地位
本周硬科技领域投融资事件一共39起,人工智能领域发生21起融资事件,占比55%;生物医药领域发生5起融资事件和3起收购事件,占比21%;区块链领域发生4起融资事件,占比10%;新能源发生2起融资事件,占比5%;3R(VR/AR/MR)、物联网和航空航天领域分别发生1起融资事件,分别占比3%。
镁客网
2019/11/12
5200
投融资汇总 | 本周(9.22-9.29)影谱科技获追加融资加固“最高纪录”地位
一文看尽科大讯飞年度发布会:医疗,是这家A股AI公司的新赛道
李根 假装发自 凹非寺 量子位 报道 | 公众号 QbitAI 一年一度,科大讯飞总会通过年终发布会,披露一年成绩,发布最新战略。 与去往年不同,自AlphaGo在2016年横空出世之后,人工智能狂飙突进,以语音起家的科大讯飞,也成了A股市场最受关注的人工智能公司。 即便伴随一些营收、盈利方面的争议,但讯飞年度发布会,依然是各方关注焦点,讯飞甚至国内AI趋势,也可以在此窥见一二,特别是来自资本市场的直接反馈。 比如去年年度发布会至今年,讯飞股价已从30.6元,上涨至60.10元,涨幅96%,其间最高涨幅一
量子位
2018/03/23
1.3K0
解放千万智能家居,度家给出语音控制的最优解
当你想要知道明天的天气情况时,可以直接问家里的智能音箱;当你开车时想要切换导航路线,可以直接说出新的目的地;当你感觉空调不够凉爽的时候,也可以直接告诉空调把温度调低一些……
Alter聊科技
2023/01/13
5150
谷歌、亚马逊、微软、苹果和脸谱如何抢占美国语音市场
语音将会成为面向消费者和企业的下一个重要平台。本文分析了五大巨头如何抢占规模490亿美元的语音市场,五大巨头总计投资了38家人工智能语音企业,并陆续推出了智能音箱和语音助手等产品抢占市场!
点滴科技资讯
2019/03/06
4.3K0
推荐阅读
浮华热潮正在消退 人工智能还能走多远?丨科技云·视角
2730
智能家居虽然前景看好,但如何甩掉人为干预才是其落地关键
4160
智能家居如火如荼,各玩家的第一步棋都下在哪里?
4160
智头条|欧盟达成《人工智能法》协议,全球前沿科技齐聚AWE 2023,三年后中国智能家居市场规模有望达453亿美元
3480
2018年至2010年,国家政策表明要推动人工智能领域发展
1.6K0
声纹识别技术:安全指数更高但其发展仍面临重重阻碍
1.8K0
2016年人工智能产业梳理:一朝引爆,稳步前进(中篇)
5030
图像识别落地B端应用,商业化的“绣球”先抛给了哪些行业?
7160
【研报】全球智能语音市场将达200亿美元,进入群雄纷争时代
1.5K0
浅析:智能家居缘何不温不火?
6840
【盘点】巨头在人工智能市场的战略布局
1.1K0
人工智能的十大应用
3.9K0
科大讯飞胡郁演讲实录:人工智能是这个时代最伟大的魔法师
9680
数据解读:资本追逐的14个人工智能细分领域
8980
左手握技术,右手握需求,但声纹识别依旧当不了“独行侠”
9480
AI引领,语音识别技术有怎样的发展趋势?
5500
投融资汇总 | 本周(9.22-9.29)影谱科技获追加融资加固“最高纪录”地位
5200
一文看尽科大讯飞年度发布会:医疗,是这家A股AI公司的新赛道
1.3K0
解放千万智能家居,度家给出语音控制的最优解
5150
谷歌、亚马逊、微软、苹果和脸谱如何抢占美国语音市场
4.3K0
相关推荐
浮华热潮正在消退 人工智能还能走多远?丨科技云·视角
更多 >
LV.0
南京市镁一刻网络科技有限公司
目录
  • 1. Service Worker 介绍
    • 1.1 丰富的离线体验
    • 1.2. 消息推送通知
    • 1.3. 管理资源缓存
    • 1.4. 网络请求
  • 2. 状态管理
  • 3. service-worker.js
    • 3.1 Work Box
      • 3.1.1 以下为 GenerateSW 样例文件
      • 3.1.2 以下为 InjectManifest 样例文件
  • 4. 个人博客案例:fredliang.cn
    • 4.1 InjectManifest 默认注入的部分(使用打包到本地的 workbox 库)
    • 4.2 人工配置的文件部分
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档