12

Sto implementando notifiche push in un'app iOS utilizzando i servizi Amazon SNS e Amazon Cognito. Cognito salva i token con successo, la mia app viene notificata, tutto funziona bene, ma c'è una cosa.AMAZON AWS ​​Come posso iscrivere un endpoint all'argomento SNS?

Ora, quando ancora in fase di sviluppo, ho bisogno di aggiungere manualmente endpoint a un argomento SNS, in modo che tutti gli abbonati possano ricevere notifiche. Quando spingerò un aggiornamento all'App Store, ci saranno migliaia di token da aggiungere.

Stavo studiando la documentazione di Amazon AWS, ma non avevo idea se fosse possibile realizzarlo senza lo sforzo aggiuntivo.

La mia domanda: è possibile automaticamente sottoscrivere un endpoint ad un argomento con i servizi di Amazon solo?

+0

Can voi chiarire un po '? Cosa intendi con solo i servizi Amazon? È ciò che stai cercando di automatizzare la sottoscrizione a un argomento e l'utilizzo di Cognito come credenziali per farlo? –

+0

@JeffBailey, grazie per le vostre domande. L'ho già capito, ma non ho avuto abbastanza tempo per rispondere autonomamente. Volevo automatizzare la sottoscrizione, ma non sapevo che la mia app per iOS fosse responsabile della sottoscrizione di un endpoint a un argomento, stavo pensando che è possibile attraverso la console di Amazon AWS dopo aver chiamato cognito per salvare un token. – cyborg86pl

+0

"ma non ha avuto abbastanza tempo per rispondere autonomamente". Quindi non condividerai la risposta che ti è venuta in mente? È terribile, dopo che gli altri sono venuti in aiuto. Sii un buon cittadino SO e condividi la tua soluzione. – user3344977

risposta

20

Non esiste un modo per automaticamente sottoscrivere un endpoint a un argomento, ma è possibile eseguire tutto attraverso il codice.

È possibile chiamare direttamente l'API Subscribe dopo aver creato l'endpoint. A differenza di altri tipi di abbonamento, non è necessaria alcuna conferma con SNS Mobile Push.

Ecco qualche esempio di codice Objective-C che crea un endpoint e sottoscrive a un argomento:

AWSSNS *sns = [AWSSNS defaultSNS]; 
AWSSNSCreatePlatformEndpointInput *endpointRequest = [AWSSNSCreatePlatformEndpointInput new]; 
endpointRequest.platformApplicationArn = MY_PLATFORM_ARN; 
endpointRequest.token = MY_TOKEN; 

[[[sns createPlatformEndpoint:endpointRequest] continueWithSuccessBlock:^id(AWSTask *task) { 
    AWSSNSCreateEndpointResponse *response = task.result; 

    AWSSNSSubscribeInput *subscribeRequest = [AWSSNSSubscribeInput new]; 
    subscribeRequest.endpoint = response.endpointArn; 
    subscribeRequest.protocols = @"application"; 
    subscribeRequest.topicArn = MY_TOPIC_ARN; 
    return [sns subscribe:subscribeRequest]; 
}] continueWithBlock:^id(BFTask *task) { 
    if (task.cancelled) { 
     NSLog(@"Task cancelled"); 
    } 
    else if (task.error) { 
     NSLog(@"Error occurred: [%@]", task.error); 
    } 
    else { 
     NSLog(@"Success"); 
    } 
    return nil; 
}]; 

Assicurarsi l'accesso è stato concesso a sns:Subscribe nei vostri ruoli Cognito per consentire l'applicazione per rendere questa chiamata .

Aggiornamento 2015/07/08: aggiornato per riflettere AWS iOS SDK 2.2.0+

+0

L'ho capito da solo, ed è il modo giusto (e solo?). Grazie comunque, la tua risposta potrebbe essere utile per qualcun altro in futuro. – cyborg86pl

+0

@ cyborg86pl È possibile iscriversi tramite la console, ma è molto più di un processo manuale. –

+0

Ed è quello che volevo evitare, grazie. – cyborg86pl

1

Se si desidera utilizzare le credenziali statiche invece di usare AWSCognito è necessario creare quelle tramite console Amazzoni IAM.

Ecco il codice per l'inizializzazione l'Amazzonia nel vostro App Delegato

// Sets up the AWS Mobile SDK for iOS 
    // Initialize the Amazon credentials provider 
    AWSStaticCredentialsProvider *credentialsProvider =[[AWSStaticCredentialsProvider alloc] initWithAccessKey:AWSAccessID secretKey:AWSSecretKey]; 

    AWSServiceConfiguration *configuration = [[AWSServiceConfiguration alloc] initWithRegion:DefaultServiceRegionType credentialsProvider:credentialsProvider]; 

    [AWSServiceManager defaultServiceManager].defaultServiceConfiguration = configuration; 

Fissh

+0

Non sicuro se sia una buona idea, SDK AWS indica di non utilizzare AWSStaticCredentialsProvider in produzione: 'Scoraggiamo fortemente l'incorporamento delle credenziali AWS nelle app di produzione perché possono essere facilmente estratte e abusate . Prendi in considerazione l'utilizzo di 'AWSCognitoCredentialsProvider'' – Ben

+0

Sono completamente d'accordo con Popei, avrei dovuto menzionare l'avviso. – gadildafissh

+0

Bene questa è la considerazione di base quando si applica uno qualsiasi dei servizi AWS e certamente non una risposta alla domanda di cui sopra. –

2

Questo è il codice originale di sottoscrivere un endpoint ad un argomento in Swift3

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { 

    //Get Token ENDPOINT 
    let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)}) 

    //Create SNS Module 
    let sns = AWSSNS.default() 
    let request = AWSSNSCreatePlatformEndpointInput() 
    request?.token = deviceTokenString 

    //Send Request 
    request?.platformApplicationArn = Constants.SNSDEVApplicationARN 

    sns.createPlatformEndpoint(request!).continue({ (task: AWSTask!) -> AnyObject! in 
     if task.error != nil { 
      print("Error: \(task.error)") 
     } else { 

      let createEndpointResponse = task.result! as AWSSNSCreateEndpointResponse 
      print("endpointArn: \(createEndpointResponse.endpointArn)") 

      let subscription = Constants.SNSEndPoint //Use your own topic endpoint 

      //Create Subscription request 
      let subscriptionRequest = AWSSNSSubscribeInput() 


       subscriptionRequest?.protocols = "application" 
       subscriptionRequest?.topicArn = subscription 
       subscriptionRequest?.endpoint = createEndpointResponse.endpointArn 

       sns.subscribe(subscriptionRequest!).continue ({ 
        (task:AWSTask) -> AnyObject! in 
        if task.error != nil 
        { 
         print("Error subscribing: \(task.error)") 
         return nil 
        } 

        print("Subscribed succesfully") 

        //Confirm subscription 
        let subscriptionConfirmInput = AWSSNSConfirmSubscriptionInput() 
        subscriptionConfirmInput?.token = createEndpointResponse.endpointArn 
        subscriptionConfirmInput?.topicArn = subscription 
        sns.confirmSubscription(subscriptionConfirmInput!).continue ({ 
         (task:AWSTask) -> AnyObject! in 
         if task.error != nil 
         { 
          print("Error subscribing: \(task.error)") 
         } 
         return nil 
        }) 
        return nil 

       }) 

      } 
      return nil 

     }) 
    } 
Problemi correlati