診斷 Azure 通知中樞中已卸除的通知

關於 Azure 通知中樞的常見問題,是如何在用戶端裝置上未顯示來自應用程式的通知時進行疑難解答。 客戶想要知道通知遭到捨棄的位置和原因,以及如何修正問題。 本文會識別裝置可能會捨棄或未收到通知的原因。 它也會說明如何判斷根本原因。

請務必先瞭解通知中樞如何將通知推送至裝置。

Notification Hubs architecture

在一般傳送通知流程中,訊息會從 應用程式後端 傳送至通知中樞。 通知中樞會處理所有註冊。 它會考慮已設定的標記和標記表達式,以判斷目標。 目標是需要接收推播通知的註冊。 這些註冊可以跨越我們任何支持的平臺:Android、百度(中國 Android 裝置)、Fire OS (Amazon) iOS、Windows 和 Windows 電話。

建立目標之後,通知中樞會將通知推送至裝置平臺的 推播通知服務 。 範例包括 iOS 和 macOS 的 Apple 推播通知服務 (APN),以及 Android 裝置的 Firebase 雲端通訊 (FCM)。 通知中樞會將通知分割成多個批次的註冊。 它會根據您在 [設定通知中樞] 底下 Azure 入口網站 中設定的認證,向個別推播通知服務進行驗證。 推播通知服務接著會將通知轉送至個別 的用戶端裝置

通知傳遞的最後一回合是在平臺的推播通知服務與裝置之間。 在推播通知程式(用戶端、應用程式後端、通知中樞和平臺推播通知服務)的四個階段中,通知傳遞可能會失敗。 如需通知中樞架構的詳細資訊,請參閱 通知中樞概觀

在初始測試/預備階段期間,可能無法傳遞通知。 在這個階段卸除的通知可能表示設定問題。 如果在生產環境中發生無法傳遞通知,可能會卸除部分或所有通知。 在此情況下,會指出更深入的應用程式或傳訊模式問題。

下一節將探討可能會卸除通知的案例,範圍從常見到罕見。

通知中樞設定錯誤

若要將通知傳送至個別的推播通知服務,通知中樞必須在應用程式的內容中自行驗證。 您必須使用目標平臺的通知服務(Microsoft、Apple、Google 等)建立開發人員帳戶。 然後,您必須向OS註冊應用程式,其中取得用來處理目標 PNS 的令牌或密鑰。

您必須將平台認證新增至 Azure 入口網站。 如果沒有通知到達裝置,第一個步驟是確保通知中樞中已設定正確的認證。 認證必須符合在平臺特定開發人員帳戶下建立的應用程式。

如需完成此程式的逐步指示,請參閱 開始使用 Azure 通知中樞。

以下是檢查的一些常見設定錯誤:

通知中樞名稱位置

請確定您的通知中樞名稱(不含錯字)在下列每個位置中都相同:

  • 從客戶端註冊的位置
  • 從後端傳送通知的位置
  • 設定推播通知服務認證的位置

請確定您在用戶端和應用程式後端上使用正確的共用存取簽章組態字串。 一般而言,您必須在用戶端上使用DefaultListenSharedAccessSignature,並在應用程式後端使用DefaultFullSharedAccessSignature。 這會授與將通知傳送至通知中樞的許可權。

APN 設定

您必須維護兩個不同的中樞:一個用於生產環境,另一個用於測試。 您必須將您在沙盒環境中使用的憑證上傳至與您在生產環境中使用的憑證/中樞不同的中樞。 請勿嘗試將不同類型的憑證上傳至相同的中樞。 這會導致通知失敗。

如果您不小心將不同類型的憑證上傳至相同的中樞,您應該刪除中樞並開始使用新的中樞。 如果基於某些原因,您無法刪除中樞,您至少必須從中樞刪除所有現有的註冊。

FCM 組態

注意

如需 Firebase 雲端傳訊取代和移轉步驟的相關信息,請參閱 Google Firebase 雲端傳訊移轉。

  1. 請確定您從 Firebase 取得的伺服器金鑰符合您在 Azure 入口網站 中註冊的伺服器金鑰。

    Firebase server key

  2. 請確定您已在客戶端上設定 項目識別碼 。 您可以從 Firebase 儀錶板取得專案識別碼的值

    Firebase Project ID

應用程式問題

標記和標記表達式

如果您使用標記或標記表達式來分割物件,則當您傳送通知時,找不到任何目標。 此錯誤是以傳送呼叫中指定的標記或標記表達式為基礎。

檢閱您的註冊,以確保當您傳送通知時標記相符。 然後,請確認只有具有這些註冊的用戶端收到通知。

例如,假設使用通知中樞的所有註冊都會使用標籤 「Politics」。如果您接著傳送具有「運動」標籤的通知,則不會將通知傳送至任何裝置。 複雜的案例可能涉及使用 「Tag A」 或 「Tag B」 註冊的標籤表示式,但以 「Tag A && Tag B」 為目標。本文稍後的自我診斷秘訣一節說明如何檢閱註冊及其標籤。

範本問題

如果您使用範本,請確定您遵循範本中所述的指導方針。

無效的註冊

如果已正確設定通知中樞,且標記或標記表達式已正確使用,則會找到有效的目標。 通知應該傳送至這些目標。 然後,通知中樞會以平行方式引發數個處理批次。 每個批次都會將訊息傳送至一組註冊。

注意

因為通知中樞會平行處理批次,因此不保證傳遞通知的順序。

通知中樞已針對「最多一次」訊息傳遞模型進行優化。 我們嘗試重複數據刪除,因此不會多次將通知傳遞至裝置。 系統會檢查註冊,以確保在傳送至推播通知服務之前,每個裝置標識碼只會傳送一則訊息。

每個批次都會傳送至推播通知服務,接著會接受並驗證註冊。 在此程式中,推播通知服務可能會偵測批次中一或多個註冊的錯誤。 推播通知服務接著會將錯誤傳回通知中樞,而進程會停止。 推播通知服務會完全卸除該批次。 這特別適用於使用 TCP 資料流通訊協定的 APN。

在此情況下,會從資料庫移除錯誤註冊。 然後,我們會重試該批次中其餘裝置的通知傳遞。

若要針對註冊取得失敗傳遞嘗試的詳細資訊,您可以使用通知中樞 REST API Per Message Telemetry:取得通知訊息遙測PNS 意見反應。 如需範例程式代碼,請參閱 傳送 REST 範例

推播通知服務問題

推播通知服務收到通知之後,會將通知傳遞至裝置。 此時,通知中樞無法控制將通知傳遞至裝置。

因為平臺通知服務很健全,因此通知通常會在幾秒鐘內觸達裝置。 如果推播通知服務正在節流,通知中樞會套用指數輪詢策略。 如果推播通知服務仍無法連線 30 分鐘,則會有原則可過期並永久卸除訊息。

如果推播通知服務嘗試傳遞通知,但裝置已離線,則推播通知服務會儲存通知。 它只會儲存一段有限的時間。 當裝置可供使用時,通知會傳遞至裝置。

每個應用程式只會儲存一個最近的通知。 如果裝置離線時傳送多個通知,則每個新通知都會捨棄最後一個通知。 只保留最新的通知稱為 在APN中聯合 ,並在 FCM 中折疊 。 (FCM 使用折疊索引鍵。當裝置長時間保持離線時,會捨棄為裝置儲存的通知。 如需詳細資訊,請參閱 APNs概觀關於 FCM 訊息

使用通知中樞,您可以使用一般 SendNotification API,透過 HTTP 標頭傳遞聯合密鑰。 例如,針對 .NET SDK,您會使用 SendNotificationAsync。 SendNotification API 也會採用與個別推播通知服務一樣傳遞的 HTTP 標頭。

自我診斷秘訣

以下是診斷通知中樞中已卸除通知的根本原因的路徑。

驗證認證

推播通知服務開發人員入口網站

確認個別推播通知服務開發人員入口網站中的認證(APN、FCM、Windows 通知服務等等)。 如需詳細資訊,請參閱教學課程:使用 Azure 通知中樞將通知傳送至 通用 Windows 平台 應用程式。

Azure 入口網站

若要檢閱並比對您從推播通知服務開發人員入口網站取得的認證,請移至 Azure 入口網站 中的 [存取原則] 索引標籤。

Azure portal Access Policies

驗證註冊

Visual Studio

在 Visual Studio 中,您可以透過伺服器總管連線到 Azure,以檢視和管理多個 Azure 服務,包括通知中樞。 此快捷方式主要適用於您的開發/測試環境。

Visual Studio Server Explorer

Server Explorer

您可以檢視和管理中樞中的所有註冊。 註冊可依平臺、原生或範本註冊、標記、推播通知服務標識碼、註冊標識碼和到期日分類。 您也可以在此頁面上編輯註冊。 它特別適合用於編輯標記。

以滑鼠右鍵按兩下 [伺服器總管] 中的通知中樞,然後選取 [診斷]。

Visual Studio Server Explorer: Diagnose menu

您會看到下列頁面:

Visual Studio: Diagnose page

切換至 [ 裝置註冊] 頁面:

Visual Studio: Device Registrations

您可以使用 [測試傳送 ] 頁面來傳送測試通知訊息:

Visual Studio: Test Send

注意

使用 Visual Studio 只在開發/測試期間編輯註冊,且註冊數目有限。 如果您需要大量編輯註冊,請考慮使用如何:大量匯出和修改註冊中所述 導出和匯入註冊功能。

服務匯流排總管

許多客戶都會使用 服務匯流排 Explorer 來檢視和管理其通知中樞。 服務匯流排 Explorer 是開放原始碼專案。

驗證訊息通知

Azure 入口網站

若要將測試通知傳送給用戶端,而不需要服務後端並執行,請在 [支援 + 疑難解答] 底下,選取 [測試傳送]。

Test Send functionality in Azure

Visual Studio

您也可以從 Visual Studio 傳送測試通知。

Test Send functionality in Visual Studio

偵錯失敗的通知並檢閱通知結果

EnableTestSend 屬性

當您透過通知中樞傳送通知時,通知一開始會排入佇列。 通知中樞會決定正確的目標,然後將通知傳送至推播通知服務。 如果您使用 REST API 或任何用戶端 SDK,則傳送呼叫的傳回只表示訊息已排入通知中樞的佇列。 它不會提供通知中樞最終將通知傳送至推播通知服務時所發生狀況的深入解析。

如果您的通知未抵達用戶端裝置,當通知中樞嘗試將它傳遞至推播通知服務時,可能會發生錯誤。 例如,承載大小可能超過推播通知服務所允許的最大值,或通知中樞中設定的認證可能無效。

若要深入瞭解推播通知服務錯誤,您可以使用 EnableTestSend 屬性。 當您從入口網站或 Visual Studio 用戶端傳送測試訊息時,會自動啟用此屬性。 您可以使用這個屬性來查看詳細的偵錯資訊,以及透過 API。 目前,您可以在 .NET SDK 中使用。 它最終會新增至所有用戶端 SDK。

若要搭配 EnableTestSend REST 呼叫使用 屬性,請將名為 test 的查詢字串參數附加至傳送呼叫的結尾。 例如:

https://mynamespace.servicebus.windows.net/mynotificationhub/messages?api-version=2013-10&test

.NET SDK 範例

以下是使用 .NET SDK 傳送原生快顯通知的範例:

NotificationHubClient hub = NotificationHubClient.CreateClientFromConnectionString(connString, hubName);
var result = await hub.SendWindowsNativeNotificationAsync(toast);
Console.WriteLine(result.State);

在執行結束時, result.State 只需指出 Enqueued。 結果不會提供您推播通知所發生狀況的任何見解。

接下來,您可以使用 EnableTestSend 布爾值屬性。 當您初始化 NotificationHubClient 時,EnableTestSend請使用 屬性,以取得傳送通知時所發生推播通知服務錯誤的詳細狀態。 傳送呼叫需要額外的時間才能傳回,因為它首先需要通知中樞將通知傳遞至推播通知服務。

    bool enableTestSend = true;
    NotificationHubClient hub = NotificationHubClient.CreateClientFromConnectionString(connString, hubName, enableTestSend);

    var outcome = await hub.SendWindowsNativeNotificationAsync(toast);
    Console.WriteLine(outcome.State);

    foreach (RegistrationResult result in outcome.Results)
    {
        Console.WriteLine(result.ApplicationPlatform + "\n" + result.RegistrationId + "\n" + result.Outcome);
    }

範例輸出

DetailedStateAvailable
windows
7619785862101227384-7840974832647865618-3
The Token obtained from the Token Provider is wrong

此訊息指出通知中樞中設定的認證無效,或中樞中的註冊發生問題。 刪除此註冊,並讓用戶端在傳送訊息之前重新建立註冊。

注意

EnableTestSend使用屬性會大幅節流。 只有在開發/測試環境中,以及一組有限的註冊時,才使用此選項。 偵錯通知只會傳送至10個裝置。 處理偵錯傳送也有限制,每分鐘 10 次。 偵錯通知也會從 Azure 通知中樞 SLA 中排除。

檢閱遙測

Azure 入口網站

在入口網站中,您可以快速概觀通知中樞中的所有活動。

  1. 在 [概 觀] 索引標籤上,您可以依平臺查看註冊、通知和錯誤的匯總檢視。

    Notification Hubs overview dashboard

  2. 在 [ 活動記錄] 索引標籤上,您可以新增其他平臺特定計量,以取得更深入的外觀。 您可以特別查看通知中樞嘗試將通知傳送至推播通知服務時所傳回的錯誤。

    Azure portal activity log

  3. 在 [概觀] 索引標籤上,從檢閱傳入訊息註冊作業成功通知開始。 然後,移至 [每個平臺] 索引標籤,以檢閱該推播通知服務特有的錯誤。

  4. 如果通知中樞的驗證設定不正確,則會出現 PNS 驗證錯誤訊息。 這是檢查推播通知服務認證的良好指示。

程式設計存取

如需程式設計存取的詳細資訊,請參閱 以程序設計方式存取

注意

數個遙測相關功能,例如透過 API 匯出和匯入註冊和匯入遙測存取,僅適用於標準服務層級。 如果您嘗試從免費或基本服務層級使用這些功能,如果您使用 SDK,您將會收到例外狀況訊息。 如果您直接從 REST API 使用功能,您將會收到 HTTP 403(禁止)錯誤。

若要使用遙測相關功能,請先確定您在 Azure 入口網站 使用標準服務層級。