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