前言
Progressive Web Application (PWA) 也可以讓我們來發通知,透過 Service Worker 的 Registration 物件來發送。
也可以接收來自 Server 的訊息通知(Web Push),在 Service Worker js 中監聽 push 事件。
以下就讓我們來實作出 Notification 及 Web Push .
實作
要求顯示通知權限
一開始要判斷 Notification 是否存在,存在就可以透過 Notification.requestPermission 來要求顯示通知權限
1 | const checkNotificationSupport = () => { |
簡單文字通知
透過 Service Worker 的 Registration 物件呼叫 showNotification Method 來顯示通知
1 |
|
豊富的通知
一樣是呼叫 showNotification,第2個參數可讓我們設定較為複雜通知 UI
1 |
|
Web Push
Voluntary Application Server Identification (VAPID)
要使用 Web Push 就需要有 Voluntary Application Server Identification(VAPID),所以可以使用 web-push 來建立
開啟 Command 視窗
1.安裝 web-push node 套件
1 |
|
2.建立 VAPID
1 |
|
pushManager.subscribe Client 訂閱 Web Push 通知
有了 VAPID 後,就可以透過 pushManager.subscribe 來訂閱
1 | function urlB64ToUint8Array(url) { |
pushManager.subscribe 的 subscription 內容如下,
所以 server side 就可以 Keys.auth 為 Key 將整個 subscription 存起來
pushManager.subscribe Client 訂閱 Web Push 通知
1 | //將訂閱通知資料從 server 端刪除掉 |
Server Push Notification
在 Server 端做 Web Push ,可透過 web-push-csharp 來幫我們。
所以安裝 WebPush 套件
1 | Install-Package WebPush |
需要通知 Client 時,就可以從 DB 中取出 Client 訂閱資料,進行通知
1 | // using WebPush; |
Service Worker Js 要監聽 push 事件
Service Worker Js 要監聽 push 事件,取得 Web Push 的內容,再呼叫 self.registration.showNotification 來顯示 Notification。
1 | self.addEventListener('push', event => { |
以下為 Android 手機的通知
以上為 Web Push Notification 的實作介紹,因為通知是透過 browser 來通知的,所以 Browser 有開啟才會收到通知哦!
而要取得這個 Client 有沒有訂閱,可以透過 serviceWorkerRegObj.pushManager.getSubscription() 來取得訂閱的資料,如下,
1 | navigator.serviceWorker.getRegistration() |
按下 Notification 控制
在 Service Worker JS 中的 notificationclick 可控制使用者按下通知後要做的事
1 | self.addEventListener('notificationclick', event => { |
Notification Close
1 | self.addEventListener('notificationclose', event => { |