我使用AWS SNS通过订阅单个SNS主题下的所有设备向移动应用发送推送通知。然后发送通知我只是发送到该主题。但是如果某个端点由于某种原因无法接收消息,SNS会将该端点标记为已禁用。
如果SNS只标记一个永久无效的端点,这可能会很好,但事实并非如此。因为如果我重新启用它,那么在下一次推送通知发送后它可能不会再次禁用,这意味着在下次推送时它可以正确接收消息。
重新启用的过程非常痛苦,我必须安排一个批处理过程来循环每个SNS应用程序下的所有端点,并将每个设备端点1重新启用1.这需要数小时,并随着设备数量的增长而增加。
由于用户已经卸载了应用,我怎么知道哪个端点真的不再有效,所以我不必费心重新启用它? 或者,有没有更好的方法来处理这个?
答案 0 :(得分:1)
我认为问题的正确解决方案是首先阻止端点被禁用。策略应该是SNS只禁用永久无效的端点,例如app卸载的情况,并避免/从其他情况中恢复。
我与AWS支持部门保持联系。我开始了解设备的设备令牌可能无效的情况,在我的情况下,我有一个逻辑,我重新启用设备的端点,但使用与以前相同的无效令牌。因此,端点将被启用,但只要对其执行了推送,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
//////////////////////