AMAZON AWS 我如何为端点订阅 SNS 主题?
Posted
技术标签:
【中文标题】AMAZON AWS 我如何为端点订阅 SNS 主题?【英文标题】:AMAZON AWS How do i subscribe an endpoint to SNS topic? 【发布时间】:2015-01-14 11:49:13 【问题描述】:我正在使用 Amazon SNS 和 Amazon Cognito 服务的 ios 应用程序中实施推送通知。 Cognito 成功保存令牌,我的应用收到通知,一切正常,但有一点。
现在,仍处于开发阶段时,我需要手动将端点添加到 SNS 主题,以便所有订阅者都能收到通知。当我将更新推送到 App Store 时,将有数千个令牌要添加。
我正在研究 Amazon AWS 文档,但不知道是否有可能在不付出额外努力的情况下实现它。
我的问题:是否可以自动将端点订阅到具有亚马逊服务仅的主题?
【问题讨论】:
你能澄清一下吗?仅使用亚马逊服务是什么意思?您是否正在尝试自动订阅主题并使用 Cognito 作为凭据? @JeffBailey 感谢您的提问。我已经想通了,但没有足够的时间来自我回答。我想自动订阅,但我不知道我的 iOS 应用程序负责订阅一个主题的端点,我想在调用 cognito 保存令牌后可以通过 Amazon AWS 控制台。 “但没有足够的时间自我回答。”所以你不打算分享你想出的答案吗?太可怕了,在别人帮忙之后。成为一名优秀的 SO 公民并分享您的解决方案。 【参考方案1】:无法自动将端点订阅到主题,但您可以通过代码完成所有操作。
您可以在创建端点后直接调用Subscribe
API。与其他类型的订阅不同,SNS 移动推送无需确认。
这里是一些示例 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+
【讨论】:
我自己想通了,这是正确的(也是唯一的?)方式。无论如何,谢谢,您的回答将来可能对其他人有所帮助。 @cyborg86pl 可以通过控制台订阅,但这更像是一个手动过程。 Bob,你能告诉我为什么我的订阅数量停止在 2000 个,而应用程序端点仍在增长吗?我知道主题有 10M 的限制,那么问题出在哪里? @cyborg86pl 如果您在控制台中查看,控制台仅显示 2,000 个订阅的限制。如果您需要查看所有订阅,则需要使用原始 API。 好的,谢谢,不用担心。如果亚马逊给出一个提示,就像我现在在“订阅”选项卡中看到的那样,限制为 10100,那就太好了。【参考方案2】:这是将端点订阅到Swift3
中的主题的原始代码
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
)
【讨论】:
【参考方案3】:如果您想使用静态凭证而不是 AWSCognito,您需要通过 Amazon IAM 控制台创建这些凭证。
这是在您的 App Delegate 中初始化 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;
鱼
【讨论】:
不确定这是否是个好主意,AWS SDK 表示不要在生产中使用 AWSStaticCredentialsProvider :We strongly discourage embedding AWS credentials in your production apps because they can be easily extracted and abused. Consider using 'AWSCognitoCredentialsProvider'
我完全同意 Popei,我应该提到警告。
这是应用任何 AWS 服务时的基本考虑因素,当然不是上述问题的答案。以上是关于AMAZON AWS 我如何为端点订阅 SNS 主题?的主要内容,如果未能解决你的问题,请参考以下文章
Spring aws-cloud SNS http端点确认订阅不起作用