2014-03-05 4 views
8

Ich entwickle eine iOS-Anwendung mit Simple Notification Service (SNS) von Amazon Web Services. An dieser Stelle registriert die App das Gerät zu einem Thema und kann Push-Benachrichtigungen erhalten, die im Thema veröffentlicht werden. Es ist möglich, ein Gerät für viele Themen zu abonnieren.Wie kann ich ein iOS-Gerät von einem amazon SNS-Thema abmelden?

Jetzt versuche ich ein Gerät von einem bestimmten Thema abzumelden, aber die SNSUnsubscribeRequest benötigt eine SubscriptionARN. Ich habe versucht, die EndpointARN von dem Gerät zu verwenden, aber es scheint, dass ich ein extra SubscriptionARN für die Kombination von EndpointARN und TopicARN verwenden muss. Wie bekomme ich diesen ARN?

In diesem Beitrag: How do you get the arn of a subscription? fragen sie nach der ganzen Liste der Abonnenten und vergleichen jedes EndpointARN mit dem EndpointARN des Geräts. Das kann nicht der richtige Weg sein, denke ich.

abonnieren Thema

// 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; 

Die Methode findTopicARNForTopic bereits iteriert über die Liste der Themen und das Suffix mit dem Themennamen vergleichen. Ich weiß wirklich nicht, ob dies die beste Vorgehensweise ist.

abmelden Thema

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); 
    } 
} 
+1

Jetzt bitte ich um die gesamte Abonnentenliste und vergleiche die EndpointARN mit der EndpointARN des Gerätes. Ich werde den Code nach dem Warten auf 8 Stunden posten ... –

+0

Ich hatte das gleiche Problem und wiederholte durch die Abonnentenliste Art von es behoben. Mein Anliegen ist Sicherheit: Wie können wir sicher sein, dass nur das aktuelle Gerät abgemeldet wird? Ist es möglich, dass andere Geräte abgemeldet werden? – tharkay

+0

Auch: eine Antwort mit Ihrer Lösung und der neue Code könnte für andere hilfreich sein. – tharkay

Antwort

5

Vorerst bitte ich für die gesamte Teilnehmerliste und vergleichen Sie die EndpointARN mit dem EndpointARN des Gerätes. Mit dem folgenden Verfahren erhalten i das Abonnement 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; 
} 

und mit dieser Methode entferne ich das Gerät von einem Thema:

- (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); 
     } 
    } 
} 
1

Sie auch die SubscriptionArn im SubscribeResponse speichern könnten und verwenden diesen Wert in UnSubscribeRequest.

+0

Das ist nicht gut. Das von der Subskriptionsanforderung zurückgegebene ARN ist nur "ausstehende Bestätigung". Ein tatsächlicher ARN wird erst erstellt, wenn das Abonnement vom anderen Dienst bestätigt wird. – BrianC

Verwandte Themen