網頁推送發生問題時,可能難以偵錯,或是 尋求協助。本文件將概述一些常見問題,以及您應採取的行動 如果您在 Chrome 或 Firefox 中發現錯誤,請進行更新。
在深入探索推送偵錯功能之前,您可能無法順利進行偵錯 Service Worker 本身,檔案並未更新、無法註冊 通常只是異常行為另有 有關對 Service Worker 偵錯的詳盡文件 我強烈建議您確認自己是新手 Service Worker 開發作業。
開發及測試網路推送時,應檢查 2 個不同的階段 每個問題都有專屬的一組常見問題
- 傳送訊息:確認訊息傳送成功。
您應該會收到 201 HTTP 代碼。如果您不使用 :
- 檢查授權錯誤:如果您收到授權 錯誤訊息 授權問題部分。
- 其他 API 錯誤:如果您收到 201 以外的狀態碼回應, 請參閱 HTTP 狀態碼部分, 說明問題原因
- 接收訊息:如果您可以成功傳送訊息,
但瀏覽器並未收到訊息:
- 檢查加密問題:請參閱酬載加密機制 問題部分。
- 檢查連線問題:如果是 Chrome 的問題, 可能是連線請參閱連線問題一節 瞭解詳情。
如果您無法收發推送訊息,也無法收到相關部分 無法協助偵錯問題,那麼您可能會發現 推送機製本身發生的錯誤在此情況下,請參閱 提高錯誤報告 一節,提交一份詳盡的錯誤報告,並附上所有必要資訊,加快處理速度 錯誤修正程序。
開始前,我想先介紹一下 Firefox 和 Mozilla AutoPush Service 有出色的錯誤訊息。如果遇到困難 不確定有問題的部分,請在 Firefox 中進行測試,看看是否 取得更實用的錯誤訊息
授權問題
授權問題是開發人員在 從網路推播開始這通常是因為 網站的應用程式伺服器金鑰 (又稱 VAPID 金鑰) 。
如要透過 Firefox 和 Chrome 支援推送功能,最簡單的方法就是提供
subscribe()
呼叫中的 applicationServerKey
。缺點是
您的前端與伺服器金鑰之間的任何差異都會導致
授權錯誤。
Chrome 和 FCM
如果是使用 FCM 做為推送服務的 Chrome,
FCM 針對不同範圍發表 UnauthorizedRegistration
則回覆
這全都牽涉到應用程式伺服器金鑰
您會在以下任一情況收到 UnauthorizedRegistration
錯誤
情境:
- 如果您無法在向 FCM 提出的要求中定義
Authorization
標頭, - 您用於訂閱使用者的應用程式金鑰與所用的金鑰不符 簽署 Authorization 標頭。
- 到期日在 JWT 中無效,即到期時間超過 24 小時, 您的 JWT 已過期。
- JWT 格式錯誤或含有無效的值。
完整的錯誤回應如下所示:
<html>
<head>
<title>UnauthorizedRegistration</title>
</head>
<body bgcolor="#FFFFFF" text="#000000">
<h1>UnauthorizedRegistration</h1>
<h2>Error 400</h2>
</body>
</html>
如果您在 Chrome 中收到此錯誤訊息,建議您使用 Firefox 進行測試 這能讓你更加瞭解問題所在
Firefox 和 Mozilla AutoPush
Firefox 和 Mozilla AutoPush 提供了一組方便使用的錯誤訊息
Authorization
個問題。
您還會收到以下來源的 Unauthorized
錯誤回應:
如果推送中未包含 Authorization
標頭,則使用 Mozilla AutoPush
請求。
{
"errno": 109,
"message": "Request did not validate missing authorization header",
"code": 401,
"more_info": "http://autopush.readthedocs.io/en/latest/http.html#error-codes",
"error": "Unauthorized"
}
如果 JWT 中的到期日已到期,您也會收到
系統顯示 Unauthorized
錯誤訊息,說明權杖已
已過期。
{
"code": 401,
"errno": 109,
"error": "Unauthorized",
"more_info": "http://autopush.readthedocs.io/en/latest/http.html#error-codes",
"message": "Request did not validate Invalid bearer token: Auth expired"
}
若應用程式伺服器金鑰與使用者
訂閱,且 Authorization 標頭經過簽署時,Not Found
:
{
"errno": 102,
"message": "Request did not validate invalid token",
"code": 404,
"more_info": "http://autopush.readthedocs.io/en/latest/http.html#error-codes",
"error": "Not Found"
}
最後,如果您的 JWT 含有無效值 (例如「alg」值 是未預期的值,您會在 Mozilla 收到以下錯誤: 自動推送:
{
"code": 401,
"errno": 109,
"error": "Unauthorized",
"more_info": "http://autopush.readthedocs.io/en/latest/http.html#error-codes",
"message": "Request did not validate Invalid Authorization Header"
}
HTTP 狀態碼
基於各種問題, 傳遞服務下方是 HTTP 狀態碼清單,以及它們代表的意義 。
狀態碼 | 說明 |
---|---|
429 | 傳送的要求過多,您的應用程式伺服器已達頻率限制, 傳遞服務服務的回應應包含「重試後」標頭至 指明要多久才能再次提出要求。 |
400 | 要求無效,其中一個標題無效或 格式有誤。 |
404 | 找不到。在此情況下,您應該從自己的 並等待對該名使用者重新訂閱。 |
410 | 已不存在。訂閱項目已失效,應從 後端。只要在 `PushSubscription`. |
413 | 酬載過大。推送服務必須具有的酬載大小下限 則支援為 4096 個位元組 (或 4 KB)。任何數值過大都可能會造成這項錯誤。 |
如果 HTTP 狀態碼不在此清單中,且錯誤訊息 有幫助,請檢查網頁推送通訊協定 規格,確認 參考狀態碼,以及 。
酬載加密問題
如果您可以順利觸發推送訊息 (例如傳送訊息到網頁) 並接收 201 回應代碼),但推送事件從未在 通常表示瀏覽器無法執行 解密收到的訊息。
如果是這種情況,Firefox 的開發人員工具中會顯示錯誤訊息 如下所示:
如要檢查這是否為 Chrome 問題,請按照下列步驟操作:
- 前往 about://gcm-internals 並點選「開始錄影」按鈕。
- 觸發推送訊息,並查看「Message Decryption Failure Log」下方的資訊。
如果酬載的解密發生問題,系統會顯示錯誤訊息
類似於上方所示(請注意 AES-GCM decryption failed
訊息)。
如果這個問題發生,以下工具可協助對加密作業進行偵錯:
連線問題
如果您在 Service Worker 未收到推送事件,而且沒有 如果出現任何解密錯誤,表示瀏覽器可能無法連線至 推送服務
使用 Chrome 時,你可以檢查瀏覽器是否收到訊息
「接收訊息記錄」about://gcm-internals
中的 (sic)。
如果您沒有在時看到訊息,請確認
您的瀏覽器連線狀態是 CONNECTED
:
如果不是「已連結」,你可能需要刪除現有個人資料, 建立新的帳戶。如果這樣 仍無法解決問題,請按照下方建議提交錯誤報告。
提出錯誤報告
如果上述事項均無法解決問題,且 請針對您使用的瀏覽器回報一個問題 問題:
如果是 Chrome,請透過下列管道回報問題: https://bugs.chromium.org/p/chromium/issues/list 如果是 Firefox,您應該向以下網站回報問題: https://bugzilla.mozilla.org/
為了提供優質的錯誤報告,請提供下列詳細資料:
- 您曾測試過的瀏覽器 (例如 Chrome 版本 50、Chrome 版本 51、Firefox 第 50 版,Firefox 51 版)。
- 說明問題的
PushSubscription
範例。 - 加入所有範例要求 (例如要推送的網路要求內容) 服務,包括標頭)。
- 請一併附上來自網路要求的所有範例回應。
如果您能提供可重現的例子,例如原始碼或代管網站 通常可以加快診斷和解決問題的速度。