ios - services - sns amazon example
AWS de AMAZON ¿Cómo me suscribo un punto final al tema de SNS? (3)
Estoy implementando notificaciones automáticas en una aplicación de iOS con los servicios de Amazon SNS y Amazon Cognito. Cognito guarda los tokens con éxito, mi aplicación recibe una notificación, todo funciona bien, pero hay una cosa.
Ahora, cuando todavía está en desarrollo, necesito agregar puntos finales manualmente a un tema SNS, para que todos los suscriptores puedan recibir notificaciones. Cuando introduzca una actualización en la tienda de aplicaciones, habrá miles de tokens para agregar.
Estaba estudiando la documentación de Amazon AWS, pero no había ninguna pista sobre si es posible lograrlo sin ese esfuerzo adicional.
Mi pregunta: ¿es posible suscribir automáticamente un punto final a un tema solo con servicios de Amazon?
No hay forma de suscribir automáticamente un punto final a un tema, pero puede lograr todo a través del código.
Puede llamar directamente a la API de Subscribe
después de haber creado su punto final. A diferencia de otros tipos de suscripción, no se necesita confirmación con SNS Mobile Push.
Aquí hay un ejemplo de código Objective-C que crea un punto final y lo suscribe a un tema:
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;
}];
Asegúrese de haber otorgado acceso a los sns:Subscribe
en sus funciones de Cognito para permitir que su aplicación haga esta llamada.
Actualización 2015-07-08: actualizada para reflejar AWS iOS SDK 2.2.0+
Si desea usar credenciales estáticas en lugar de usar AWSCognito, deberá crearlas a través de la consola Amazons IAM.
Aquí está el código para inicializar Amazon en su delegado de la aplicación
// 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
Este es el código original para suscribir un punto final a un tema en 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
})
}