程序员的自我修养
Home » Web Push » 第三方Web Push

第三方Web Push

0条评论146次浏览

最近在思考团队和个人下一步的方向,业务上一度确定准备做第三方web push,但一番调研下来,发现国内做的意义不大。这里把一些过程和结论记录下来吧。

什么是Web Push

"The Push API enables sending of a push message to a webapp via a push service. An application server can send a push message at any time, even when a webapp or user agent is inactive. The push service ensures reliable and efficient delivery to the user agent. Push messages are delivered to a Service Worker that runs in the origin of the webapp, which can use the information in the message to update local state or display a notification to the user."

简单来说,web push可以在关闭页面、甚至关闭浏览器的情况下,依然可以将消息下发到终端(这真是一个听着就神烦的玩意)。

为何出现web push?

主要还是和google大力推行PWA(Progressive Web Apps)有关。PWA是一种让网页长得和app一样的技术。然而想让网页和app具有同样的表达能力,一个比较大的问题就是:app有推送功能,网页如何实现?虽然h5定义了Web Notifications,可以询问是否允许推送、如果允许了可以推送消息,但那毕竟是需要页面打开的情况下才行。

于是google又推出了一个叫Service Workers的技术。如果把浏览器看成操作系统,把pwa站点看成运行在操作系统上的app,那么Service Workers就是pwa app在这个操作系统上的后台进程(其实就是一段隔离执行的js,当页面关闭的情况下依然能够执行一段时间,这段js可以定义接收到推送消息后的动作)。浏览器接收到服务端的推送消息后,根据Service Workers里面定义的动作,最后通过h5的Web Notifications api进行展示。

整个链路都通了后,web push就自然而然的诞生了。

什么是Web Notifications

Web Notifications是html5定义的一套api接口,主要用来询问是否允许消息通知、展示消息通知等。目前主流浏览器中,只有firefox、chrome、safari、opera支持。详细可以看这篇文章,介绍的很不错:简单了解HTML5中的Web Notification桌面通知

Service Workers又是什么

"It is a script that runs silently in the background of a browser which is registered against an origin and path. A registered service worker doesn’t need the webpage to be opened in order to work. It runs in a separate thread which is non-blocking in manner and is designed to be asynchronous hence we cannot use APIs such as synchronous XHR and local storage inside a service worker.

Service workers are so powerful. If you are a black hat, you can use it to hijack network connections and reconstruct their response. For such security reasons, they are allowed to be run only over HTTPS. For development, you can use localhost which is considered as a secure origin."

如前文所述,service worker是一段js代码,可以在浏览器后台线程中执行,当页面关闭后,依然可以执行(但不是永远执行,浏览器会关闭service worker,具体关闭策略依浏览器不同而不同)。service通常用来做资源缓存、离线访问、消息推送等功能。

一段google官方示例代码,用来注册Service Workers,sw.js就是Service Workers的定义文件:

sw.js示例,定义了当push事件发生时的动作:

国内是否可以做第三方Web Push

很遗憾,答案是否定的。主要由2方面原因导致:

  • fcm被墙
  • 国内浏览器不支持web push

直接从代码说吧,要消息推送,必须先注册,完整见https://developers.google.com/web/fundamentals/codelabs/push-notifications/#_8。注册示例代码:

可以看到pushManager.getSubscription()是不需要定义push service信息的,也就是浏览器去哪个push service注册是浏览器内部定义好的,不是外部可以修改的。也就是说第三方push service永远无法给chrome、firefox这些已有push service的浏览器下发消息。

以上代码运行在chrome浏览器得到注册信息:

运行在firefox,则得到注册信息:

国内浏览器不支持web push,就算按照w3c标准实现了push service,说服浏览器厂商来用难度太大。chrome被墙,国内推送无望。所以只能给firefox推送消息(safari走的自己的协议,定制下也能推送;opera没有自己的push service,用的fcm),在国内大部分用户都是用360、qq、搜狗、2345的情况下,覆盖量实在是少的可怜。所以第三方web push,国内目前是看不到做的必要。

一些官方说法

google developers中提到:

"Can I change the push service a browser uses?"

No. The push service is selected by the browser and as we saw with the subscribe() call, the browser will make network requests to the push service to retrieve the details that make up the PushSubscription.

W3C Push API中提到:

There is only one push service per user agent and it cannot be changed from the default value. This limitation is due to a variety of performance-related concerns, including the complexity of running reliable push services and the impact on battery lifetime if there were an unbounded set of push services to which a device could connect.

其他

firefox中可以输入about:config,然后搜索dom.push.serverURL,可以看到浏览器默认的push service endpoint。但是页面是无法修改也无法请求修改浏览器参数的。

chrome应该也有类似的地方可以修改push service endpoint,然而并没有任何意义,页面无法修改这个值,没有用户会特意去根据你的文档去修改这个值来接收推送。

(转载本站文章请注明作者和出处 程序员的自我修养 – SelfUp.cn ,请勿用于任何商业用途)
分类:Web Push
标签:
发表评论


profile
  • 文章总数:81篇
  • 评论总数:241条
  • 分类总数:32个
  • 标签总数:45个
  • 运行时间:1253天

大家好,欢迎来到selfup.cn。

这不是一个只谈技术的博客,这里记录我成长的点点滴滴,coding、riding and everthing!

最新评论
  • Anonymous: :?: :razz: :sad:
  • Anonymous: 牛
  • Anonymous: 楼主你好,我偶尔也会 遇到Reconnect due to socket error: java.nio.channels.ClosedCha...
  • Anonymous: sdfs
  • Anonymous: :arrow: :neutral: :cry:
  • Anonymous: java.io.NotSerializableExcepti on: DStream checkpointing has been enabled but the DStreams with their...
  • wick: HI,请问一下,U,S,V得到 ,怎么得到近似矩阵 (用spark java),谢谢。
  • Michael Whitaker: Thank you for this blog, it was very helpful in troubleshooting my own issues. It seems that no...
  • Anonymous: :mad:
  • Anonymous: :???:
  • Anonymous: :mad: :mad: :mad:
  • 洋流: 哥们,我问个问题,你 把testOnborrow去掉了。。 如果得到的jedis资源...
  • 洋流: 哥们,我问个问题,你 把testOnborrow去掉了。。 如果得到的jedis资源...
  • Anonymous: :razz: :evil: :grin:
  • 张瑞昌: 有很多,比较常见的是 Jacob迭代法,一次迭代O (n^3),迭代次数不清楚 ...
  • Anonymous: :mrgreen:
  • lc277: 你好 我想问下一般删除节点 要多久,要删除的datano de大概用了1t,解除...
  • Anonymous: 你好 我想问下一般删除节点 要多久,要删除的datano de大概用了1t,解除...
  • Anonymous: :smile: :grin: :eek:
  • 李雪璇: 想要完整代码,可以帮 忙发给我吗