推播通知常見問題

Matt Gaunt

為什麼瀏覽器關閉時,推播功能無法運作?

這個問題經常出現,主要是因為有幾種情況難以推論和理解。

首先是 Android。Android 作業系統會監聽推播訊息,並在收到訊息時喚醒適當的 Android 應用程式來處理推播訊息,無論應用程式是否關閉。

這與 Android 上的任何瀏覽器完全相同,瀏覽器會在收到推播訊息時喚醒,然後瀏覽器會喚醒 Service Worker 並調度推播事件。

在電腦 OS 上,情況會更複雜,最容易解釋的是 Mac OS X,因為有視覺指標可協助解釋不同情境。

在 Mac OS X 上,您可以透過 Dock 中應用程式圖示下方的標記,判斷程式是否正在執行。

如果比較下列 Dock 中的兩個 Chrome 圖示,左側圖示下方有標記,表示正在執行,而右側 Chrome 未執行,因此下方沒有標記。

OS X 範例

在電腦上接收推播訊息時,只要瀏覽器正在執行 (即圖示下方有標記),就會收到訊息。

這表示即使瀏覽器未開啟任何視窗,Service Worker 仍會收到推播訊息,因為瀏覽器會在背景執行。

只有在瀏覽器完全關閉 (即完全未執行,無標記) 時,才不會收到推播。Windows 也是如此,但要判斷 Chrome 是否在背景執行,難度會稍微高一些。

如何讓主畫面網頁應用程式在收到推播通知時以全螢幕開啟?

在 Android 版 Google Chrome 中,網頁應用程式可以新增至主畫面,從主畫面開啟網頁應用程式時,可以全螢幕模式啟動,不顯示網址列,如下所示。

主畫面圖示到全螢幕

為了保持一致的體驗,開發人員希望使用者點選通知後,也能以全螢幕開啟網頁應用程式。

Chrome「某種程度上」實作了這項功能,但您可能會發現它不可靠且難以理解。相關實作細節如下:

也就是說,除非使用者經常透過主畫面圖示造訪網站,否則通知會在一般瀏覽器 UI 中開啟。

我們會進一步處理這個問題。

為什麼這比 WebSockets 更好?

即使瀏覽器視窗關閉,Service Worker 仍可運作。只要瀏覽器和網頁保持開啟,WebSocket 就會持續運作。

GCM、FCM、Web Push 和 Chrome 有何關聯?

這個問題涉及多個層面,最簡單的解釋方式是逐步說明網頁推播和 Chrome 的歷史。(別擔心,這份問卷很簡短)。

2014 年 12 月

Chrome 首次導入網頁推送功能時,使用 Google 雲端通訊 (GCM) 將推送訊息從伺服器傳送至瀏覽器。

這不是網頁推播。Chrome 和 GCM 的早期設定並非「真正的」網頁推播,原因如下。

  • GCM 要求開發人員在 Google Developers 控制台設定帳戶。
  • Chrome 和 GCM 需要網頁應用程式共用特殊寄件者 ID,才能正確設定訊息。
  • GCM 伺服器接受了非網路標準的自訂 API 要求。

2016 年 7 月

7 月時,網頁推播功能推出新功能:應用程式伺服器金鑰 (或 VAPID,如規格所述)。Chrome 新增對這個 API 的支援時,改用 Firebase 雲端通訊 (又稱 FCM) 做為訊息服務,而非 GCM。這項功能之所以重要,原因如下:

  • Chrome 和應用程式伺服器金鑰不需要透過 Google 或 Firebase 設定任何專案。就能順利運作。
  • FCM 支援網路推播通訊協定,這是所有網路推播服務都會支援的 API。也就是說,無論瀏覽器使用哪種推播服務,只要提出相同類型的要求,系統就會傳送訊息。

為什麼今天會令人困惑?

目前網路上有大量關於網路推播主題的內容,其中大部分都提及 GCM 或 FCM,因此造成許多混淆。如果內容提及 GCM,可能代表內容過時,或過度著重於 Chrome。(我以前也常在貼文中這麼做)。

相反地,請將網路推送視為由瀏覽器組成,瀏覽器會使用推送服務來管理訊息的傳送和接收,而推送服務會接受「網路推送通訊協定」要求。如果從這個角度思考,您就可以忽略瀏覽器和推播服務,直接開始工作。

本指南著重於網頁推播的標準做法,並刻意忽略其他內容。

Firebase 提供 JavaScript SDK。內容和原因

如果您發現 Firebase 網頁 SDK 有 JavaScript 訊息 API,可能會想知道它與網頁推播有何不同。

訊息 SDK (稱為 Firebase 雲端通訊 JS SDK) 會在幕後執行一些技巧,讓您更輕鬆地導入網頁推播。

  • 您不必擔心 PushSubscription 及其各種欄位,只需擔心 FCM 權杖 (字串)。
  • 您可以使用專屬的 FCM API,透過每位使用者的權杖觸發推播訊息。這個 API 不需要加密酬載。您可以在 POST 要求主體中傳送純文字酬載。
  • FCM 的專屬 API 支援自訂功能,例如 FCM 主題 (也適用於網頁,但相關說明文件不完整)。
  • 最後,FCM 支援 Android、iOS 和網頁,因此對某些團隊來說,在現有專案中使用 FCM 較為容易。

這項功能會在背景使用網頁推播,但目標是將其抽象化。

如前一題所述,如果將網頁推播視為瀏覽器和推播服務,那麼 Firebase 中的 Messaging SDK 就是簡化網頁推播實作的程式庫。

後續步驟

程式碼研究室