Amazon SNS CreatePlatformApplication 在重用平台应用程序时返回错误
Posted
技术标签:
【中文标题】Amazon SNS CreatePlatformApplication 在重用平台应用程序时返回错误【英文标题】:Amazon SNS CreatePlatformApplication returns error when reusing platform applications 【发布时间】:2014-04-15 17:49:10 【问题描述】:我的代码可以为每条发出的消息创建一个新的平台应用程序。我认为这很浪费,所以我尝试更改代码以使用 list_platform_applications
来获取可用的应用程序并重用具有正确名称的应用程序(PlatformApplicationArn
的一部分)。
当我突然从CreatePlatformApplication
收到此错误时,这将适用于连续几条消息:
"Error":"Code":"InvalidParameter","Message":"无效参数:这个 端点已经注册到不同的 令牌。","Type":"Sender","RequestId":"06bd3443-598e-5c06-9f5c-7f84349ea067"
这甚至没有意义。我正在创建一个端点。我没有传递一个。它真的在抱怨它返回的端点吗?
根据亚马逊文档:
"CreatePlatformEndpoint 动作是幂等的,所以如果请求者 已经拥有一个具有相同设备令牌和属性的端点, 该端点的 ARN 会在不创建新端点的情况下返回。”
在我看来,如果有合适的,它将被退回。否则,创建一个全新的。
我错过了什么吗?
【问题讨论】:
我在创建 GCM android 端点时面临同样的问题。不是为传递的不同令牌创建不同的端点。 ?? 也面临同样的问题。我将 node.js 与一个名为 sns-mobile 的模块一起使用,该模块又包装了 aws-sdk。在 AWS SNS 控制台中,我可以看到如何创建新的“重复”端点(即使用相同的令牌),直到每个令牌有 4 个;从那时起,创建新端点(对于已经存在的令牌)失败并出现上述错误。真的很奇怪。 【参考方案1】:哦,该死的。我想我找到了这种行为的原因。遇到这个问题后,我确保每个令牌只上传一次到 AWS SNS。在测试这个时,我意识到我最终得到了具有 same 令牌的多个端点 - 嗯? 事实证明,这些重复的令牌是由 outdated 令牌上传到 AWS SNS 造成的。在使用过时的令牌创建端点后,SNS 将通过使用 current 设备令牌(afaik 作为规范 ID 从 GCM 传回一次)来自动恢复端点您尝试将推送消息发送到过时的令牌)。
例如上传这些(虚构的)令牌和自定义数据
APA9...YFDw, original_token: APA9...YFDw
APA9...XaSd, original_token: APA9...XaSd <-- Assume this token is outdated
APA9...sVQa, original_token: APA9...sVQa
可能会导致这样的结果 - 即具有相同令牌的不同端点:
APA9...YFDw, original_token: APA9...YFDw, arn:aws:sns:eu-west-1:4711:endpoint/GCM/myapp/daf64...5c204
APA9...YFDw, original_token: APA9...XaSd, arn:aws:sns:eu-west-1:4711:endpoint/GCM/myapp/a980f...e3c82 <-- Duplicate token!
APA9...sVQa, original_token: APA9...sVQa, arn:aws:sns:eu-west-1:4711:endpoint/GCM/myapp/14777...7d9ff
反过来,这种情况似乎会在随后尝试使用过时的令牌创建端点时导致上述错误。另一方面,后续请求失败似乎是正确的。另一方面,直觉上我有直觉,正在发生的令牌重复似乎是错误的,或者至少难以处理。也许一旦 SNS 发现某个令牌已过时并需要更改,它可以首先检查是否已经存在具有相同令牌的另一个端点...
我将对此进行更多研究,看看是否能找到正确处理此问题的方法。
干杯
【讨论】:
我刚刚遇到了和你一样的问题。对我们来说,这意味着我们不会使用 amazon sns,因为它无法在特定设备上为我们的应用程序创建单个 URI。在这种情况下,我们实际上更容易与 GCM、APNS 集成。顺便说一句,您可以通过卸载应用程序强制使用新令牌,卸载时发送推送消息,然后重新安装。注册端点后,您将始终获得两个具有相同令牌的 ARN(一段时间后) 端点/令牌很可能会随着时间的推移而过期。但是当这种情况发生时,您可以更新属性以启用它们。这里概述了一个好的令牌策略:mobile.awsblog.com/post/Tx223MJB0XKV9RU/…【参考方案2】:遇到同样的问题,设备报告一个令牌(根据 GCM 已过时),而 SNS 检索/存储另一个令牌。
我们通过清除设备上的应用缓存并重新打开应用(在我们的例子中,在 gcm 服务上重新注册设备)来解决这个问题,生成 SNS 试图推送到的相同令牌(未过期) .
【讨论】:
以上是关于Amazon SNS CreatePlatformApplication 在重用平台应用程序时返回错误的主要内容,如果未能解决你的问题,请参考以下文章