How to unsubscribe an iOS Device from an amazon SNS topic?

I'm developing an iOS application with Simple Notification Service (SNS) from Amazon Web Services. At this point the app registers the device to a Topic and can receive push notifications, which are published to the Topic. It is possible to subscribe a device to many Topics.

Now I'm trying to unsubscribe a device from a specific Topic, but the SNSUnsubscribeRequest needs a SubscriptionARN. I've tried to use the EndpointARN from the device, but it seems I've to use an extra SubscriptionARN for the combination of EndpointARN and TopicARN. How do I get this ARN?

In this post: How do you get the arn of a subscription? they ask for the whole list of subscribers and compare each EndpointARN with the EndpointARN of the device. This cant be the right way i think.

Subscribe to Topic

// Check if endpoint exist
if (endpointARN == nil) {
    dispatch_async(dispatch_get_main_queue(), ^{
        [[self universalAlertsWithTitle:@"endpointARN not found!" andMessage:@"Please create an endpoint for this device before subscribe to topic"] show];
    });
    return NO;
}

// Create topic if not exist
NSString *topicARN = [self findTopicARNFor:topic];
if (!topicARN) {
    [self createTopic:topic];
    topicARN = [self findTopicARNFor:topic];
}

// Subscribe to topic if exist
if (topicARN) {
    SNSSubscribeRequest *subscribeRequest = [[SNSSubscribeRequest alloc] initWithTopicArn:topicARN andProtocol:@"application" andEndpoint:endpointARN];
    SNSSubscribeResponse *subscribeResponse = [snsClient subscribe:subscribeRequest];
    if (subscribeResponse.error != nil) {
        NSLog(@"Error: %@", subscribeResponse.error);
        dispatch_async(dispatch_get_main_queue(), ^{
            [[self universalAlertsWithTitle:@"Subscription Error" andMessage:subscribeResponse.error.userInfo.description] show];
        });
        return NO;
    }
}
return YES;

The method findTopicARNForTopic already iterates over the list of Topics and compare the suffix with the topic name. I really don't know if this is the best practice.

Unsubscribe from Topic

NSString *topicARN = [self findTopicARNFor:topic];
if (topicARN) {
    SNSUnsubscribeRequest *unsubscribeRequest = [[SNSUnsubscribeRequest alloc] initWithSubscriptionArn:topicARN];
    SNSUnsubscribeResponse *unsubscribeResponse = [snsClient unsubscribe:unsubscribeRequest];
    if (unsubscribeResponse.error) {
        NSLog(@"Error: %@", unsubscribeResponse.error);
    }
}

For now I ask for the whole subscriber list and compare the EndpointARN with the EndpointARN of the Device. With the following method i get the subscription arn:

- (NSString *)findSubscriptionARNForTopicARN:(NSString *)topicARN
{
    // Iterate over each subscription arn list for a topic arn
    NSString *nextToken = nil;
    do {
        SNSListSubscriptionsByTopicRequest *listSubscriptionRequest = [[SNSListSubscriptionsByTopicRequest alloc] initWithTopicArn:topicARN];
        SNSListSubscriptionsByTopicResponse *response = [snsClient listSubscriptionsByTopic:listSubscriptionRequest];
        if (response.error) {
            NSLog(@"Error: %@", response.error);
            return nil;
        }

        // Compare endpoint arn of subscription arn with endpoint arn of this device
        for (SNSSubscription *subscription in response.subscriptions) {
            if ([subscription.endpoint isEqualToString:endpointARN]) {
                return subscription.subscriptionArn;
            }
        }
        nextToken = response.nextToken;
    } while (nextToken != nil);
    return nil;
}

and with this method i remove the device from a topic:

- (void)unsubscribeDeviceFromTopic:(NSString *)topic
{
    NSString *subscriptionARN = [self findSubscriptionARNForTopic:topic];
    if (subscriptionARN) {
        SNSUnsubscribeRequest *unsubscribeRequest = [[SNSUnsubscribeRequest alloc] initWithSubscriptionArn:subscriptionARN];
        SNSUnsubscribeResponse *unsubscribeResponse = [snsClient unsubscribe:unsubscribeRequest];
        if (unsubscribeResponse.error) {
            NSLog(@"Error: %@", unsubscribeResponse.error);
        }
    }
}

您也可以将SubscriptionArn存储在SubscribeResponse中,并在UnSubscribeRequest中使用此值。

链接地址: http://www.djcxy.com/p/32208.html

上一篇: AWS SNS取消订阅循环未释放内存

下一篇: 如何从亚马逊SNS主题取消订阅iOS设备?