如何通过AWS SNS单次请求向多设备发送推送通知?
实现AWS SNS多设备批量推送通知
首先明确:你提到的直接向CreatePlatformEndpoint传入设备令牌数组的方式不可行,因为该API的Token参数仅支持单个设备令牌,不接受数组类型。下面提供两种可行的批量推送方案:
方案一:批量创建端点后循环推送
先为每个设备令牌创建对应的端点,得到所有端点Arn后,循环调用Publish接口发送消息。
1. 批量创建端点
// 假设deviceTokens是你的设备令牌数组 deviceTokens := []string{"token01", "token02", "token03"} var endpointArns []string for _, token := range deviceTokens { input := &sns.CreatePlatformEndpointInput{ PlatformApplicationArn: aws.String(topic), Token: aws.String(token), } result, err := svc.CreatePlatformEndpoint(input) if err != nil { // 处理错误:注意如果令牌已创建过端点,SNS会返回EndpointAlreadyExists错误,可从中提取已存在的Arn var snsErr types.EndpointAlreadyExists if errors.As(err, &snsErr) { endpointArns = append(endpointArns, *snsErr.EndpointArn) } else { // 处理其他创建错误 log.Printf("创建端点失败,令牌:%s,错误:%v", token, err) } continue } endpointArns = append(endpointArns, *result.EndpointArn) }
2. 循环推送消息到每个端点
payload := `{"APNS": "{\"aps\": {\"alert\": \"批量推送测试\"}}"}` messageStructure := "json" for _, arn := range endpointArns { params := &sns.PublishInput{ Message: aws.String(payload), TargetArn: aws.String(arn), MessageStructure: aws.String(messageStructure), } _, err := svc.Publish(params) if err != nil { log.Printf("推送消息失败,端点Arn:%s,错误:%v", arn, err) } }
方案二:使用SNS主题批量推送(推荐)
更高效的方式是创建一个SNS主题,将所有设备端点订阅到该主题,之后只需向主题发送一次消息,所有订阅的设备都会收到推送。
1. 创建SNS主题
topicInput := &sns.CreateTopicInput{ Name: aws.String("批量推送主题"), } topicResult, err := svc.CreateTopic(topicInput) if err != nil { log.Fatalf("创建主题失败:%v", err) } topicArn := *topicResult.TopicArn
2. 批量订阅端点到主题
for _, arn := range endpointArns { subscribeInput := &sns.SubscribeInput{ Protocol: aws.String("application"), Endpoint: aws.String(arn), TopicArn: aws.String(topicArn), } _, err := svc.Subscribe(subscribeInput) if err != nil { log.Printf("订阅端点失败,Arn:%s,错误:%v", arn, err) } }
3. 向主题发送消息
只需一次Publish调用,所有订阅的设备都会收到通知:
params := &sns.PublishInput{ Message: aws.String(payload), TopicArn: aws.String(topicArn), MessageStructure: aws.String(messageStructure), } _, err := svc.Publish(params) if err != nil { log.Fatalf("向主题推送消息失败:%v", err) }
关键说明
CreatePlatformEndpoint不支持批量创建,必须逐个处理设备令牌;遇到重复令牌时,API会返回已存在的端点Arn,可直接复用。- 方案二更适合长期需要向同一组设备推送的场景,只需订阅一次,后续推送只需调用一次
Publish。 - 确保你的SNS权限配置正确,允许创建端点、主题以及订阅操作。
内容的提问来源于stack exchange,提问作者Sameer Sheikh
相关产品推荐
相关产品推荐

