Ios – AMAZON AWS How do i subscribe an endpoint to SNS topic

amazon-cognitoamazon-snsamazon-web-servicesiospush-notification

I'm implementing push notifications in an iOS app using Amazon SNS and Amazon Cognito services.
Cognito saves tokens successfully, my app gets notified, everything's working well, but there is a thing.

Now, when still in development, I need to manually add endpoints to an SNS topic, so all subscribers can get notifications. When i'll push an update to the App Store, there will be thousands of tokens to add.

I was studying Amazon AWS documentation, but there was no clue whether it's possible to make it happen without that additional effort.

My question: is it possible to automatically subscribe an endpoint to a topic with Amazon services only?

Best Answer

There is no way to automatically subscribe an endpoint to a topic, but you can accomplish all through code.

You can directly call the Subscribe API after you have created your endpoint. Unlike other kinds of subscription, no confirmation is necessary with SNS Mobile Push.

Here is some example Objective-C code that creates an endpoint and subscribes it to a topic:

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;
}];

Make sure you have granted access to sns:Subscribe in your Cognito roles to allow your application to make this call.

Update 2015-07-08: Updated to reflect AWS iOS SDK 2.2.0+

Related Topic