如何對透過 Amazon SNS 或 Amazon Pinpoint 發佈 APN 推送通知時的 “DeviceTokenNotForTopic” 錯誤進行疑難排解?

上次更新日期:2022 年 2 月 14 日

我的 Apple 推送通知服務 (APN) 行動推送通知無法透過 Amazon Simple Notification Service (Amazon SNS) 或 Amazon Pinpoint 傳送。當推送通知失敗時,APN 傳回 400 狀態代碼,並顯示 "DeviceTokenNotForTopic" 錯誤訊息。為什麼我會收到此錯誤,以及該如何解決問題?

簡短描述

如果 APN 無法識別連結至憑證的搭售方案 ID (主題/應用程式),則 APN 會傳回 400 狀態代碼並出現以下錯誤:"DeviceTokenNotForTopic"。

發生此錯誤時,APN 還會停用關聯的平台端點。

此問題是由推送通知的 POST API 請求標頭欄位中不正確的 APN 搭售方案 ID 所引起。

要解決使用 Amazon SNS 或 Amazon Pinpoint 向 APN 傳送推送通知時出現的錯誤,請先啟動已停用的平台端點。然後,檢查已在 APN 中為您的應用程式註冊的搭售方案 ID,並根據您的使用案例執行以下操作之一:

  • 更新應用程式的搭售方案 ID 以符合已向 APN 註冊的搭售方案 ID。

-或-

  • 覆寫 Amazon SNS 或 Amazon Pinpoint 在推送通知的 POST API 請求標頭欄位中使用的搭售方案 ID。

有關更多資訊,請參閲《Amazon SNS 開發人員指南》中的使用者通知流程概觀Apple 身分驗證方法。此外,在 Apple 開發人員網站上處理來自 APN 的通知回應

注意:您可以為某些應用程式事件發生時設定行動應用程式事件通知,以便對該事件採取程式設計動作。例如,當停用平台端點時。

解決方案

注意:如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請確保您使用的是最新的 AWS CLI 版本

啟動已停用的平台端點

對於 Amazon SNS

執行 set-platform-application-attributes AWS CLI 命令。

對於 Amazon Pinpoint

執行 update-endpoint AWS CLI 命令。

有關更多資訊,請參閲《Amazon SNS 開發人員指南》中的建立平台端點向 Amazon Pinpoint 新增端點

查看您的應用程式已向 APN 註冊的搭售方案 ID

1.    開啟您的 Apple 開發人員帳戶。

2.    在左側導覽列中,選擇 Certificates, IDs & Profiles (憑證、ID 和設定檔)。

3.    在左側導覽列中,選擇 Identifiers (識別符)。然後,App IDs (應用程式 ID)。

4.    選擇您的應用程式。

5.    複製 Name (名稱) 欄位中的搭售方案 ID。這是您的應用程式已向 APN 註冊的搭售方案 ID。

更新應用程式的搭售方案 ID 以符合已向 APN 註冊的搭售方案 ID

1.    下載 Xcode,如果您還沒有下載。

2.    開啟 Xcode。

3.    選擇應用程式的根專案資料夾。

4.    選擇 Signing & Capabilities (簽署與功能)。

5.    在 Bundle Identifier (搭售方案識別符) 文字欄位中,輸入您的應用程式已向 APN 註冊的搭售方案 ID。系統會自動儲存新的搭售方案 ID。

覆寫 Amazon SNS 或 Amazon Pinpoint 在推送通知的 POST API 請求標頭欄位中使用的搭售方案 ID

對於 Amazon SNS

在 Amazon SNS 向 APN 傳送的 POST API 請求中,請為以下預留訊息屬性指定自訂 APN 標頭值:AWS.SNS.MOBILE.APNS.TOPIC。確保自訂標頭值與已向 APN 註冊的搭售方案 ID 相符。

有關指示和範例命令,請參閲《Amazon SNS 開發人員指南》中的指定自訂 APN 標頭值

對於 Amazon Pinpoint

在 Amazon Pinpoint 傳送至 APN 的 POST API 請求中,修改 ThreadId 屬性以符合已向 APN 註冊的搭售方案 ID。

有關更多資訊,請參閲 Amazon Pinpoint REST API 參考中的訊息和 AWS CLI 參考中的 send-messages

Amazon Pinpoint 的 send-messages 命令範例,該命令用於向特定端點傳送推送通知

aws pinpoint send-messages --application-id 38d6b2282bdc4b46b2e24a14efe04914 --message-request file://pinpointapns.json

針對覆寫應用程式搭售方案 ID 之 APN 推送通知的 Amazon Pinpoint Post API 請求結構描述範例

注意:此結構描述範例中 ThreadId 的值 (搭售方案 ID) 是 "com.example.push"

{   
 "Addresses": {
 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX": {  
 "ChannelType": "APNS_SANDBOX"  
 }     
 },       
 "MessageConfiguration": {  
 "APNSMessage": {
 "APNSPushType": "alert",
 "Body":"Sample Text for iOS Endpoints",  
 "ThreadId":"com.example.push" 
 }      
 }        
}

此文章是否有幫助?


您是否需要帳單或技術支援?