如何解决通过 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(证书、标识符和描述文件)。

3.    在左侧导航栏中选择 Identifiers(标识符)。然后选择 App IDs(App 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 请求中,为预留消息属性 (AWS.SNS.MOBILE.APNS.TOPIC) 指定自定义 APN 标头值。确保自定义标头值匹配向 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

Amazon Pinpoint Post API 请求架构示例,用于覆盖应用程序捆绑包 ID 的 APN 推送通知

注意:此示例架构中的 ThreadId 值(捆绑包 ID)为 com.example.push

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

这篇文章对您有帮助吗?


您是否需要账单或技术支持?