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

亚马逊 AWS 如何为终端节点订阅 SNS 主题?

麻和雅
2023-03-14

我正在使用亚马逊 SNS 和亚马逊认知服务在 iOS 应用程序中实施推送通知。Cognito成功保存了代币,我的应用程序收到通知,一切正常,但有一件事。

现在,当仍在开发中时,我需要手动将endpoint添加到SNS主题,以便所有订阅者都可以获得通知。当我向App Store推送更新时,将会有数千个令牌需要添加。

我正在研究Amazon AWS留档,但不知道是否有可能在没有额外努力的情况下实现它。

我的问题:是否可以自动将终端节点订阅到仅包含亚马逊服务的主题?

共有3个答案

巫马炫明
2023-03-14

如果您想使用静态凭证而不是使用 AWS 隐身,则需要通过亚马逊 IAM 控制台创建这些凭证。

下面是在您的应用程序委托中初始化Amazon的代码

    // Sets up the AWS Mobile SDK for iOS
    // Initialize the Amazon credentials provider
    AWSStaticCredentialsProvider *credentialsProvider =[[AWSStaticCredentialsProvider alloc] initWithAccessKey:AWSAccessID secretKey:AWSSecretKey];

    AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc] initWithRegion:DefaultServiceRegionType credentialsProvider:credentialsProvider];

    [AWSServiceManager defaultServiceManager].defaultServiceConfiguration = configuration;

菲什

钱志强
2023-03-14

这是为Swift3中的主题订阅endpoint的原始代码

 func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

    //Get Token ENDPOINT
    let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})

    //Create SNS Module
    let sns = AWSSNS.default()
    let request = AWSSNSCreatePlatformEndpointInput()
    request?.token = deviceTokenString

    //Send Request
    request?.platformApplicationArn = Constants.SNSDEVApplicationARN

    sns.createPlatformEndpoint(request!).continue({ (task: AWSTask!) -> AnyObject! in
        if task.error != nil {
            print("Error: \(task.error)")
        } else {

            let createEndpointResponse = task.result! as AWSSNSCreateEndpointResponse
            print("endpointArn: \(createEndpointResponse.endpointArn)")

            let subscription = Constants.SNSEndPoint //Use your own topic endpoint

            //Create Subscription request
            let subscriptionRequest = AWSSNSSubscribeInput()


              subscriptionRequest?.protocols = "application"
                subscriptionRequest?.topicArn = subscription
                subscriptionRequest?.endpoint = createEndpointResponse.endpointArn

                sns.subscribe(subscriptionRequest!).continue ({
                    (task:AWSTask) -> AnyObject! in
                    if task.error != nil
                    {
                        print("Error subscribing: \(task.error)")
                        return nil
                    }

                    print("Subscribed succesfully")

                   //Confirm subscription
                    let subscriptionConfirmInput = AWSSNSConfirmSubscriptionInput()
                    subscriptionConfirmInput?.token = createEndpointResponse.endpointArn
                    subscriptionConfirmInput?.topicArn = subscription
                    sns.confirmSubscription(subscriptionConfirmInput!).continue ({
                        (task:AWSTask) -> AnyObject! in
                        if task.error != nil
                        {
                            print("Error subscribing: \(task.error)")
                        }
                        return nil
                    })
                    return nil

                })

            }
            return nil

        })
    }
颛孙安康
2023-03-14

没有办法自动为一个endpoint订阅一个主题,但是您可以通过代码来完成这一切。

创建endpoint后,可以直接调用<code>订阅

下面是一些创建endpoint并为其订阅主题的Objective-C代码示例:

AWSSNS *sns = [AWSSNS defaultSNS];
AWSSNSCreatePlatformEndpointInput *endpointRequest = [AWSSNSCreatePlatformEndpointInput new];
endpointRequest.platformApplicationArn = MY_PLATFORM_ARN;
endpointRequest.token = MY_TOKEN;

[[[sns createPlatformEndpoint:endpointRequest] continueWithSuccessBlock:^id(AWSTask *task) {
    AWSSNSCreateEndpointResponse *response = task.result;

    AWSSNSSubscribeInput *subscribeRequest = [AWSSNSSubscribeInput new];
    subscribeRequest.endpoint = response.endpointArn;
    subscribeRequest.protocols = @"application";
    subscribeRequest.topicArn = MY_TOPIC_ARN;
    return [sns subscribe:subscribeRequest];
}] continueWithBlock:^id(BFTask *task) {
    if (task.cancelled) {
        NSLog(@"Task cancelled");
    }
    else if (task.error) {
        NSLog(@"Error occurred: [%@]", task.error);
    }
    else {
        NSLog(@"Success");
    }
    return nil;
}];

确保您已在Cognito角色中授予了对sns:Subscribe的访问权限,以允许应用程序进行此调用。

更新2015-07-08:已更新以反映AWS iOS SDK 2.2.0

 类似资料:
  • 当我在Amazon SNS上确认订阅时,出现以下错误: 检测到1个验证错误:“令牌”处的值null未能满足约束:成员不能为null(服务:AmazonS;状态代码:400;错误代码:ValidationError;请求ID:14f5c18d 如何解决这个问题?

  • 我们正在开发一个系统,我们需要向数千部手机发送推送通知。我们使用Amazon SNS进行了设置。我们将向每部手机发送单独的消息,因此我们直接发送到SNSendpointARN,而不是主题ARN。 我们目前正在想这个系统的性能。我在网上找不到任何关于可以向SNS发送多少消息的内容。例如,如果我需要向25000个SNSendpoint发送25000条消息,我可以以多快的速度发送它们?秒、分钟、小时?

  • 我的Android应用程序中有一个与亚马逊SNS服务相关的问题。我正在使用亚马逊SNS推送服务。请查看此链接http://docs.aws.amazon.com/sns/latest/dg/SNSMobilePush.html有关亚马逊SNS服务的更多详细信息,请参阅。 我像在Amazon samples http://docs . AWS . Amazon . com/SNS/latest/DG

  • 我试图使用amazon文档网站来了解amazon sns发布示例,但是它在消息、消息属性和消息结构方面很模糊。 首先,即使您将消息结构设置为 json,消息属性是否仍将是字符串?例如,如果我想发送一个对象而不仅仅是一个字符串消息。如果它是字符串 - 在将对象作为消息属性传递之前,我是否需要 JSON.字符串化对象? http://docs . AWS . Amazon . com/AWSJavaS

  • 我正在尝试使用亚马逊AWS向我的手机发送短信。特别是,我正在使用SNS服务,在创建新订阅的过程中陷入了困境。 抱歉,我的屏幕截图在下拉菜单中无法工作,所以我用手机拍了一张贫民区的照片。 有什么想法吗?

  • 我有几个。Net 5.0微服务,RabbitMQ作为消息代理。现在我正在切换到AWS SQS。很少有服务在侦听相同的消息(这是通过RabbitMQ中的Exchange完成的)。在AWS中,这可以通过将SQS队列订阅到SNS主题来实现。我创建了SNS fifo topic和SQS fifo队列,将这些队列订阅到topic。当我将消息直接发布到队列时,一切都会立即工作,但当我将消息发布到SNS主题时,