gpt4 book ai didi

ios - 如何从亚马逊 SNS 主题取消订阅 iOS 设备?

转载 作者:可可西里 更新时间:2023-11-01 03:11:28 25 4
gpt4 key购买 nike

我正在使用来自 Amazon Web Services 的简单通知服务 (SNS) 开发一个 iOS 应用程序。此时,应用程序将设备注册到主题并可以接收推送通知,这些通知将发布到主题。可以为一个设备订阅多个主题。

现在我正尝试从特定主题取消订阅设备,但 SNSUnsubscribeRequest 需要 SubscriptionARN。我已尝试使用设备中的 EndpointARN,但似乎我必须使用额外的 SubscriptionARN 来组合 EndpointARN 和 TopicARN。我如何获得此 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);
}
}
}

关于ios - 如何从亚马逊 SNS 主题取消订阅 iOS 设备?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22196478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com