You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 04:28:15