推播訊息是一種有用的溝通管道,讓應用程式能以相關且及時的內容更新用戶。 推播訊息可以用來重新吸引用戶使用你的應用程式。
推播訊息最顯著的優勢之一是,即使用戶未積極使用應用程式,推播訊息仍可由應用程式的伺服器傳送。
推播訊息通知會參與系統的通知中心,並能顯示圖片和文字資訊。 通知很有用,能提醒使用者應用程式有重要更新。 然而,通知應少用,因為它們往往會干擾使用者的工作流程。
要建立支援推播通知的 PWA:
- 請求使用者在你 PWA 的客戶端程式碼中接收推播通知的權限。
- 訂閱你伺服器的推播訊息。
- 從你的 PWA 伺服器端程式碼發送推播訊息。
- 當收到推播訊息時會顯示通知。
步驟 1 - 請求使用者授權接收推播通知
在你向你的 PWA 發送推播通知之前,必須先向使用者申請接收訊息的許可。 要申請權限,請在用戶端程式碼中使用 Notification.requestPermission API ,例如使用者點擊按鈕時:
button.addEventListener("click", () => {
Notification.requestPermission().then(permission => {
if (permission === "granted") {
console.log("The user accepted to receive notifications");
}
});
});
你可以稍後再查看權限狀態:
if (Notification.permission === "granted") {
console.log("The user already accepted");
}
步驟 2 - 訂閱推播通知
要從你的伺服器接收推播事件,請使用 Push API 訂閱推播通知。
在建立新的推送訂閱前,Microsoft Edge 會檢查使用者是否授權 PWA 接收通知。
如果使用者尚未授權 PWA 接收通知,瀏覽器會提示使用者取得權限。 如果使用者未授權瀏覽器,請求 registration.pushManager.subscribe 會拋 DOMException出 .
以下程式碼片段展示了如何在你的 PWA 中訂閱推播通知:
async function subscribeToPushMessages() {
const serviceWorkerRegistration = await navigator.serviceWorker.ready;
// Check if the user has an existing subscription
let pushSubscription = serviceWorkerRegistration.pushManager.getSubscription();
if (pushSubscription) {
// The user is already subscribed to push notifications
return;
}
try {
// Subscribe the user to push notifications
pushSubscription = await serviceWorkerRegistration.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: urlBase64ToUint8Array("YOUR PUBLIC VAPID KEY HERE")
});
} catch (err) {
// The subscription wasn't successful.
console.log("Error", err);
}
}
// Utility function for browser interoperability
function urlBase64ToUint8Array(base64String) {
var padding = '='.repeat((4 - base64String.length % 4) % 4);
var base64 = (base64String + padding)
.replace(/\-/g, '+')
.replace(/_/g, '/');
var rawData = window.atob(base64);
var outputArray = new Uint8Array(rawData.length);
for (var i = 0; i < rawData.length; ++i) {
outputArray[i] = rawData.charCodeAt(i);
}
return outputArray;
}
前面程式碼片段中提到的 VAPID 金鑰是一個公鑰,用來識別發送推送訊息的伺服器並加密推送訊息的有效載荷。 請參閱 步驟 3 - 從你的伺服器發送推送訊息 ,以獲得更多關於 VAPID 金鑰的資訊。
userVisibleOnly函數的registration.pushManager.subscribe配置選項必須存在且設為 true。 此選項表示推播訊息必須顯示給使用者。 Microsoft Edge 不支援不會顯示給使用者的推播訊息。
步驟 3 - 從你的伺服器發送推播訊息
您的應用程式需要 VAPID (自願應用程式伺服器識別) 金鑰,才能從伺服器向 PWA 用戶端發送推送訊息。 網路上有多種 VAPID 金鑰產生器可用 (例如 Vapidkeys.com) 。
一旦你擁有 VAPID 金鑰,就可以使用 Web Push 協定向你的 PWA 客戶端發送推送訊息。 請參閱 MDN 的 推送 API 。
你可以用函式庫從伺服器發送推播訊息,視你使用的程式語言而定。 例如,如果你的伺服器使用 web-push 函式庫,Node.js 即可使用。 WebPush 函式庫中也有其他函式庫。
步驟 4 - 當收到推播訊息時顯示通知
在你的 PWA (建立訂閱後,步驟 2 - 訂閱推播通知) ,請在服務工作者中新增 push 事件處理程序,以處理伺服器發送的推送訊息。
以下程式碼片段說明如何在收到推播訊息時顯示通知:
// Listen to push events.
self.addEventListener('push', event => {
// Check if the user has granted permission to display notifications.
if (Notification.permission === "granted") {
// Get the notification data from the server.
const notificationText = event.data.text();
// Display a notification.
const showNotificationPromise = self.registration.showNotification('Sample PWA', {
body: notificationText,
icon: 'images/icon512.png'
});
// Keep the service worker running until the notification is displayed.
event.waitUntil(showNotificationPromise);
}
});
如果你的 PWA 在收到推播訊息時沒有顯示通知,Microsoft Edge 會顯示一個通用通知,表示推播訊息已收到。
另請參閱
MDN:
GitHub:
-
WebPush 函式庫
- 如果你的伺服器有用 Node.js,那就是 web-push 函式庫。
外:
- Vapidkeys.com - VAPID 金鑰產生器的範例。