Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Web Push Notifications
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Olga
June 22, 2017
Programming
1
310
Web Push Notifications
Slides for my talk at Fluent Conf, San Jose, June 22, 2017
Olga
June 22, 2017
Tweet
Share
More Decks by Olga
See All by Olga
Visual Feature Engineering for Machine Learning with React
olgapetrova
0
280
Introduction to ExtReact, ExtAngular and ExtWebComponents
olgapetrova
0
92
Visual Feature Engineering for ML with React and TensorFlow.js
olgapetrova
0
89
How to Re-Architect a JavaScript Class System
olgapetrova
0
130
How to add D3.js visualization to your Ext JS application
olgapetrova
1
620
Turbo-charged Data Analysis and Visualization using Ext JS 6.2
olgapetrova
3
110
ExtJS 6: one framework for all devices
olgapetrova
1
810
Other Decks in Programming
See All in Programming
技術検証結果の整理と解析をAIに任せよう!
keisukeikeda
0
120
Everything Claude Code OSS詳細 — 5層構造の中身と導入方法
targe
0
110
AIコードレビューの導入・運用と AI駆動開発における「AI4QA」の取り組みについて
hagevvashi
0
490
「抽象に依存せよ」が分からなかった新卒1年目の私が Goのインターフェースと和解するまで
kurogenki
0
120
コードレビューをしない選択 #でぃーぷらすトウキョウ
kajitack
3
960
コーディングルールの鮮度を保ちたい / keep-fresh-go-internal-conventions
handlename
0
200
野球解説AI Agentを開発してみた - 2026/02/27 LayerX社内LT会資料
shinyorke
PRO
0
310
Swift ConcurrencyでよりSwiftyに
yuukiw00w
0
270
S3ストレージクラスの「見える」「ある」「使える」は全部違う ─ 体験から見た、仕様の深淵を覗く
ya_ma23
0
550
AIとペアプロして処理時間を97%削減した話 #pyconshizu
kashewnuts
1
240
AWS×クラウドネイティブソフトウェア設計 / AWS x Cloud-Native Software Design
nrslib
16
3.2k
Cyrius ーLinux非依存にコンテナをネイティブ実行する専用OSー
n4mlz
0
150
Featured
See All Featured
The untapped power of vector embeddings
frankvandijk
2
1.6k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.1k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
150
Evolving SEO for Evolving Search Engines
ryanjones
0
150
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.4k
Designing for humans not robots
tammielis
254
26k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
190
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
150
Unsuck your backbone
ammeep
672
58k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
0
160
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.9k
Transcript
None
Web Push Notifications Olga Petrova Software Engineer @ Sencha
What You Will Learn • Definition & Concept • Implementation
• Framework API • State of Specifications & Browser support
Definition & Concept
Web Push Notifications Gives web applications the ability to receive
messages pushed to them from a server at any time
Target Engage users with urgent and relevant notifications and motivate
them to return to the application
Commercial Value • Increase user engagement • Increase web app
value • Replace a native app with a web app
Web Push + page/browser is inactive/closed - encryption - message
size/count limit - requires display of a notification - active web page + no encryption + no message size/count limit + no notification display required Web Sockets + real-time communication vs
Implementation
5 Players WebApp Service Worker Browser Push Server App Server
Web Push Message Encryption for Web Push Voluntary Application Server
Identification for Web Push Push API Specifications Notification API WebApp Service Worker Browser Push Server App Server
Round 1: Service Worker Registration WebApp Service Worker Browser Push
Server App Server Register ServiceWorkerRegistration Page Load
Round 1: ServiceWorker Registration if ('serviceWorker' in navigator) { if
('PushManager' in window) { navigator.serviceWorker.register('ServiceWorker.js').then(function(registration) { //state initializing }); .catch(function() { //error handling }); } else { //error handling } } else { //error handling } WebApp
Round 2: Subscription WebApp Service Worker Browser Push Server App
Server Subscribe PushSubscription Subscribe push subscription save PushSubscription User is ready to subscribe
Round 2: Subscription navigator.serviceWorker.ready.then(function(registration) { registration.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: urlBase64ToUint8Array('...')
}) .then(function(subscription) { // The subscription was successful savePushSubscription(subscription); }) .catch(function(e) { //error handling }); }); WebApp
Round 2: Permission Request WebApp Notification.requestPermission().then(function(result) { if (result!== 'granted')
{ //handle permissions deny } });
Round 2: Subscription reg.pushManagerpushManager.subscribe({ userVisibleOnly: true, applicationServerKey: new Uint8Array([...]) });
WebApp
Round 2: Subscription Object interface PushSubscription { readonly attribute endpoint;
// "https://{push_server_url}/{user_identifier}", function getKey(); //auth - authentication secret //p256dh - key for encrypting messages }; WebApp
Round 3: Push Message WebApp Service Worker Browser Push Server
App Server push message push message push message Something urgent and relevant happened
Round 3: Push Message POST /{user_identifier} HTTP/1.1 Host: {push_server_url} TTL:
15 Content-Type: text/plain;charset=utf8 Content-Length: 36 {encrypted_message} AppServer
Round 3: Additional Headers POST /{user_identifier} HTTP/1.1 Host: {push_server_url} Content-Type:
text/plain;charset=utf8 Content-Length: 36 Prefer: respond-async TTL: 15 Urgency: high Topic: upd {encrypted_message} AppServer
Round 3: Message Encryption POST /{user_identifier} HTTP/1.1 Host: {push_server_url} Content-Type:
text/plain;charset=utf8 Content-Length: 36 Prefer: respond-async TTL: 15 Urgency: high Topic: upd {encrypted_message} AppServer
Round 3: Encryption Library https://github.com/web-push-libs/web-push AppServer
Round 3: Voluntary Identification AppServer POST /{user_identifier} HTTP/1.1 Host: {push_server_url}
TTL: 15 Content-Length: 136 Authorization: Bearer eyJ0eXAi... Crypto-Key: p256ecdsa=BA1Hxzy... {encrypted_message}
Round 3: Voluntary Identification JWT = { "aud": "https://{push_server_url}", "exp":
1453341205, "sub": "{application_server_email}" } AppServer
Round 3: Push Message self.addEventListener('push', function(event) { var data =
event.data.json(); event.waitUntil(self.registration.showNotification(data.title, { body: data.body, icon: data.icon, tag: data.tag })); }); ServiceWorker
Round 3: Handle Notification self.addEventListener('notificationclick', function(event) { event.notification.close(); event.waitUntil(clients.openWindow('http://mywebsite.com')); });
ServiceWorker
Round 3: Notifications with Actions self.registration.showNotification(data.title, { body: data.body, actions:
[ { action: 'ok', title: 'Yes' }, { action: 'decline', title: 'No' } ] }); … self.addEventListener('notificationclick', function(event) { if (event.action == 'ok') { // do something } }); ServiceWorker
Round 3: Notification Close self.addEventListener('notificationclose', function(event) { //do something });
ServiceWorker
Round 3: Handle Notification if (focused) { clients.forEach(function(client){ client.postMessage({ message:
data.message }); }); } else { return self.registration.showNotification(data.title, { body: data.message }); } ServiceWorker
Round 4: Unsubscription WebApp Service Worker Browser Push Server App
Server unsubscribe OK unsubscribe OK remove PushSubscription User wants to unsubscribe
Round 4: Unsubscription registration.pushManager.getSubscription().then(function(subscription) { if (subscription) { return subscription.unsubscribe().then(function(successful)
{ removePushSubscription(subscription); }).catch(function(e) { //error handling }); } }) .catch(function(error) { //error handling }) WebApp
Additional Round: Subscription Expiration WebApp Service Worker Browser Push Server
App Server Subscription is about to expire
Additional Round: Subscription Expiration self.addEventListener('pushsubscriptionchange', function(registration, newSubscription, oldSubscription) { removePushSubscription(oldSubscription);
savePushSubscription(newSubscription); }); ServiceWorker
Framework API
Framework API • PushNotification singleton • Methods: • .subscribe(message, applicationServerKey):
Promise • .unsubscribe(): Promise • Events: • beforeNotificationShow(notification, data) • beforeNotificationClose • afterNotificationClose • subscriptionExpired(oldSubscription, newSubscription)
State of Specifications & Browser Support
State of Specifications Specification State Push API Working draft Notification
API Living standard HTTP Web Push Proposed standard Push Message Encryption protocol Internet-draft VAPID protocol Internet-draft
Browser Support Browser Desktop Mobile Chrome Yes Yes Firefox Yes
Yes Edge Beta Beta Safari Yes No Opera Yes Yes IE No No
Next Steps Using Web Push Notifications will push browser vendors
to implement this feature. Try it in your apps. Ask me questions: I’ll be at the Sencha Booth #913 Contact me: @tyoushe