我正在使用Amazon Web Services的简单通知服务(SNS)开发iOS应用程序.此时,应用程序将设备注册到主题,并可以接收推送通知,这些通知将发布到主题.可以将设备订阅到许多主题.
现在我正在尝试从特定主题取消订阅设备,但SNSUnsubscribeRequest需要SubscriptionARN.我试图从设备中使用EndpointARN,但似乎我要为EndpointARN和TopicARN的组合使用额外的SubscriptionARN.我如何获得此ARN?
在这篇文章中:How do you get the arn of a subscription?他们要求提供整个订阅者列表,并将每个EndpointARN与设备的EndpointARN进行比较.这不可能是我想的正确方法.
// 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;
findTopicARNForTopic方法已遍历主题列表,并将后缀与主题名称进行比较.我真的不知道这是不是最好的做法.
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); } }
解决方法
现在我要求整个订户列表并将EndpointARN与设备的EndpointARN进行比较.使用以下方法我得到订阅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; }
- (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); } } }