当前位置: 首页 > 知识库问答 >
问题:

如何处理SNS中禁用的endpoint

白腾
2023-03-14

我正在使用AWS SNS向移动应用发送推送通知,订阅单个SNS主题下的所有设备。然后,为了发送通知,我只发送到该主题。然而,如果某个endpoint由于任何原因无法接收消息,SNS会将该endpoint标记为禁用。

如果SNS只标记一个永久无效的endpoint,这可能很好,但事实并非如此。因为如果我重新启用它,那么在下一次消息推送后,它可能不会返回再次禁用,这意味着在下一次推送中它可以正确接收消息。

重新启用的过程相当痛苦,我必须安排一个批处理过程来循环每个SNS应用程序下的所有endpoint,并逐个1重新启用每个设备endpoint。这需要几个小时,并且随着设备数量的增加而增加。

我怎么知道哪个endpoint真的不再有效,因为用户已经卸载了一个应用程序,所以我不必费心重新启用它?或者,有没有更好的方法来处理这个问题?

共有1个答案

东方俊力
2023-03-14

我认为问题的正确解决方案是首先阻止endpoint被禁用。该策略应确保SNS仅禁用永久无效的endpoint,如应用程序卸载案例,并避免/恢复其他案例。

我与AWS支持部门联系过。我了解到一种情况,即设备的设备令牌可能会变得无效,在我的情况下,我有一个逻辑,即我正在重新启用设备的endpoint,但使用与之前相同的无效令牌。因此,endpoint将被启用,但一旦对其进行推送,SNS将再次将其标记为禁用,因为基础令牌无效。正确的做法是从设备端检查令牌是否已更改,以及何时再次通过令牌进行SNS注册。

以下是此策略的伪代码:

///////////////////////
retrieve the latest token from the mobile OS
if (endpoint arn not stored)
 # first time registration
 call CreatePlatformEndpoint
 store returned endpoint arn
endif

call GetEndpointAttributes on the endpoint arn

if (getting attributes encountered NotFound exception)
 #endpoint was deleted
 call CreatePlatformEndpoint
 store returned endpoint arn
else
 if (token in endpoint does not match latest) or
  (GetEndpointAttributes shows endpoint as disabled)
  call SetEndpointAttributes to set the
                     latest token and enable the endpoint
 endif
endif
//////////////////////
 类似资料:
  • 问题内容: AngularJS依赖于启用的JavaScript。这意味着,如果有人访问用AngularJS内置的应用程序或网站,它将无法正确呈现。 使用AngularJS时,用于处理禁用了JavaScript的访客的常用约定是什么? 请解释为什么会这样? 问题包括处理有角度的JS指令和{{data_bindings}}。这样,当页面无法呈现页面时,数据就不会显示。 问题答案: 在考虑了该问题的其他

  • 因此,我使用AWS SNS向苹果设备发送推送通知。 我遵循了以下步骤: 创建了应用程序ID 当我向该endpoint发布消息时:消息随请求发布…但通知从未出现在设备上。然后我检查endpoint并启用=false 希望有人能帮忙。谢谢。

  • 问题内容: 当我使用访问URL的请求时, cookie会自动发送回服务器 (在下面的示例中,所请求的URL设置了一些cookie值,然后重定向到另一个显示存储的cookie的URL) 是否可以通过将Chrome或Firefox设置为不接受Cookie的方式来临时禁用Cookie处理? 例如,如果我在禁用了cookie处理的情况下使用Chrome访问上述URL,则会得到我期望的结果: 问题答案: 您

  • 我注意到我的不能处理Spring Security在Spring Boot应用程序中引发的异常。 但是,我需要一种方法来捕获,当用户帐户仍然被禁用时,它似乎会被抛出。 用例很简单:如果一个用户当前被禁用,我想抛出一个适当的错误给我的客户机S.T。它可以相应地显示一条消息。 现在Spring Security的回应是 我看到了这个问题,但由于某种原因,我的没有被调用: 知道我错过了什么吗? 这是我的

  • 我已经尝试禁用Spring boot W/C抛出的默认错误处理 {“时间戳”:1575346220347,“状态”:500,“错误”:“内部服务器错误”,“异常”:“org.springframework.web.client.httpclienterroreXception”,“消息”:“401未经授权”,“路径”:“/auth/login”} 和 但是我得到的是一堆HTML格式的响应,而不是应

  • 我们正在使用Crittercism来分析我们的应用程序崩溃,但是由于我们也使用带有默认模糊选项的DexGuard,Crittercism无法使用DexGuard生成的mappings.txt对堆栈痕迹进行模糊处理。 因此,我的问题很简单: 如何禁用DexGuard混淆的非ASCII字符? 顺便说一下,我们正在使用Gradle构建系统。