推播通知常見問題

Matt Gaunt

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

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

我們先從 Android 開始。Android 作業系統的設計目的是聆聽推播訊息,並在收到推播訊息時喚醒適當的 Android 應用程式,以便處理推播訊息,無論應用程式是否已關閉皆然。

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

在桌面作業系統上,情況就比較複雜,在 Mac OS X 上說明最容易,因為有視覺指標可協助說明各種情況。

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

請比較下方 Dock 中的兩個 Chrome 圖示,左側的圖示正在執行,圖示下方有標記可供參考;右側的 Chrome 則未執行,因此下方沒有標記。

OS X 範例

在電腦上接收推播訊息時,您會在瀏覽器執行時收到訊息,也就是在圖示下方有標記時。

也就是說,瀏覽器可以沒有任何開啟的視窗,但您仍會在服務工作站中收到推播訊息,因為瀏覽器會在背景執行。

只有在瀏覽器完全關閉 (即完全未執行,沒有標記) 時,才不會收到推播。同樣適用於 Windows,但判斷 Chrome 是否在背景執行的難度較高。

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

在 Chrome 適用於 Android 的版本中,您可以將網頁應用程式新增至主畫面,並在從主畫面開啟網頁應用程式時,以不含網址列的全螢幕模式啟動,如以下所示。

將主畫面圖示設為全螢幕

為了維持一致的體驗,開發人員希望點選通知時,系統也能以全螢幕模式開啟網頁應用程式。

Chrome 「大致上」實作了這項功能,但您可能會發現這項功能不穩定且難以推理。相關實作詳細資料如下:

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

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

為什麼這比 WebSocket 更好?

瀏覽器視窗關閉時,Service Worker 可啟動。只要瀏覽器和網頁保持開啟狀態,網路通訊端連線就會持續運作。

GCM、FCM、Web Push 和 Chrome 之間的關係為何?

這個問題有許多面向,最簡單的解釋方式就是逐步說明網路推播和 Chrome 的歷史。(別擔心,很短)。

2014 年 12 月

當 Chrome 首次實作網頁推送功能時,Chrome 會使用 Google Cloud Messaging (GCM) 將推送訊息從伺服器傳送至瀏覽器。

這不是網頁推送。這項 Chrome 和 GCM 的早期設定並非「真實」的網頁推播,原因有幾個。

  • GCM 要求開發人員在 Google 開發人員管理中心設定帳戶。
  • 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 Cloud Messaging JS SDK) 會在幕後執行一些技巧,讓您更輕鬆地導入網頁推播功能。

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

這項功能會在幕後使用 Web Push,但其目標是將這項功能抽象化。

如同我在上一題所述,如果您將網頁推播視為瀏覽器和推播服務,那麼您可以將 Firebase 中的 Messaging SDK 視為程式庫,簡化網頁推播的實作方式。

後續步驟

程式碼研究室