amazon web services - precios - Obteniendo "EndpointDisabled" de Amazon SNS
sns precios (9)
De acuerdo con http://docs.aws.amazon.com/sns/latest/APIReference/API_Publish.html eso significa que el punto final está deshabilitado.
Habilitado: indicador que habilita / deshabilita la entrega al punto final. Message Processor establecerá esto en falso cuando un servicio de notificación indica al SNS que el punto final no es válido. Los usuarios pueden volver a establecerlo como verdadero, generalmente después de actualizar Token.
El "servicio de notificación" en este caso se refiere a GCM de Google, APNS de manzanas o ADM de Amazon.
Estoy usando Amazon SNS. Las notificaciones funcionan bien, pero a veces obtengo este error:
{
"message": "Endpoint is disabled",
"code": "EndpointDisabled",
"name": "EndpointDisabled",
"statusCode": 400,
"retryable": false
}
Tal vez sabes por qué.
Estoy usando esto Si la respuesta get endpoint encuentra el error NotFound, crea un punto final (esto nunca debería suceder, pero diablos, está en el sitio web de documentación de AWS SNS). Si eso no sucede, significa que está obteniendo la información para el punto final. Puede estar bien (tokens match y enabled es verdadero), o al revés (en cuyo caso debe actualizarlo).
- (void)getEndpointDetailsWithResponse:(void(^)(AWSSNSGetEndpointAttributesResponse *response, AWSTask *))handleResponse {
NSString * deviceTokenForAWS = [self deviceTokenForAWS];
AWSSNS *manager = [AWSSNS SNSForKey:@"EUWest1SNS"];
AWSSNSGetEndpointAttributesInput *input = [AWSSNSGetEndpointAttributesInput new];
input.endpointArn = self.endpointArn;
AWSTask *getEndpointAttributesTask = [manager getEndpointAttributes:input];
[getEndpointAttributesTask continueWithBlock:^id(AWSTask *task) {
NSLog(@"%@ Error: %@", task.result, task.error);
AWSSNSGetEndpointAttributesResponse *result = task.result;
NSError *error = task.error;
if (error.code == AWSSNSErrorNotFound) {
[self createEndpointWithResponse:^(AWSSNSCreateEndpointResponse *createResponse) {
dispatch_async(dispatch_get_main_queue(), ^{
if (handleResponse != nil) {
handleResponse(result, task);
}
});
}];
} else {
NSLog(@"response for get endpoint attributes : %@", result);
NSString *token = [result.attributes valueForKey:@"Token"];
NSString *enabled = [result.attributes valueForKey:@"Enabled"];
NSLog(@"token : %@, enabled : %@", token, enabled);
BOOL wasSuccessful = [token isEqualToString:deviceTokenForAWS] && ([enabled localizedCaseInsensitiveCompare:@"true"] == NSOrderedSame);
if (!wasSuccessful) {
NSLog(@"device token does not match the AWS token OR it is disabled!");
NSLog(@"Need to update the endpoint");
AWSSNSSetEndpointAttributesInput *seai = [AWSSNSSetEndpointAttributesInput new];
seai.endpointArn = self.endpointArn;
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:deviceTokenForAWS, @"Token", @"true", @"Enabled", nil];
seai.attributes = attributes;
AWSTask *setEndpointAttributesTask = [manager setEndpointAttributes:seai];
[setEndpointAttributesTask continueWithBlock:^id(AWSTask *task) {
NSLog(@"response : %@, error: %@", task.result, task.error);
dispatch_async(dispatch_get_main_queue(), ^{
if (handleResponse != nil) {
handleResponse(result, task);
}
});
return nil;
}];
} else {
NSLog(@"all is good with the endpoint");
dispatch_async(dispatch_get_main_queue(), ^{
if (handleResponse != nil) {
handleResponse(result, task);
}
});
}
}
return nil;
}];
}
Esta es la réplica exacta de la documentación de gestión de tokens AWS SNS que se encuentra aquí: https://mobile.awsblog.com/post/Tx223MJB0XKV9RU/Mobile-token-management-with-Amazon-SNS
Puedo adjuntar el resto de mi implementación si es necesario, pero esta parte es la más importante.
Hay pocas razones por las que se puede deshabilitar un punto final. No vi documentado en ninguna parte (podría haberlo perdido), esto es lo que obtuve del soporte:
Empuja hacia un punto final pero el token no es válido / expiró. Los tokens se vuelven inválidos si:
Pertenece a una aplicación que ya no está instalada en el dispositivo.
Si el dispositivo ha sido restaurado desde la copia de seguridad. Esto hace que el token no sea válido y su aplicación debe solicitar un nuevo token y actualizar el token del punto final SNS en consecuencia.
La aplicación ha sido reinstalada en el mismo dispositivo. En el caso de Android, a la aplicación se le asigna un nuevo token. Esto también sucede con los APN pero más a menudo con Android.
En el caso de los APN, se selecciona un perfil de aprovisionamiento incorrecto en xCode. En este caso, las notificaciones fallan y el dispositivo se desactiva más tarde después de la retroalimentación de APN.
Si utiliza por error un token para el desarrollo de IOS a la aplicación de producción IOS y viceversa.
Si Apple por algún motivo invalida su certificado de inserción de IOS o alguien revoca el certificado de inserción del portal de itunes connect. Esto demora unas horas antes de que el dispositivo se desactive.
Lo mismo con GCM si actualiza la clave de la API desde la consola del desarrollador de Google sin actualizar las credenciales de la aplicación Plataforma en el SNS.
Empuja hacia un punto final del dispositivo APN, pero la aplicación se ha desactivado debido al certificado de inserción caducado.
Empuja al punto final del dispositivo GCM; sin embargo, la clave API se ha actualizado en la consola del desarrollador de Google, pero no así las credenciales de la aplicación de la plataforma SNS.
Para detalles, recomiendo este excelente article que resuelve mi problema
He encontrado 3 razones hasta ahora:
- A veces mezclamos tokens de la aplicación sandbox.
- El usuario desactiva las notificaciones en la configuración del teléfono.
- El usuario desinstaló la aplicación.
Estos son con respecto a Iphons / Ipads.
Lista de comprobación rápida antes de tomar medidas drásticas:
- Genere la Solicitud de firma de certificado (CSR) mediante la aplicación Keychain .
- Exporte el certificado APNS y su clave privada en un solo archivo p12 utilizando la aplicación Keychain .
- Cuando crea una nueva aplicación en Amazon SNS, la plataforma debe coincidir con el entorno APNS ( Desarrollo / Producción en ambos lados).
- Cuando solicita un token de dispositivo, debe estar en la aplicación correcta (el identificador de paquete de la aplicación coincide con el certificado APNS).
- Cuando crea un nuevo punto final de la plataforma en AWS SNS, el token del dispositivo debe agregarse a la aplicación correcta (el certificado de la buena aplicación y la buena plataforma de Desarrollo / Producción).
En mi caso, generé la CSR utilizando una herramienta SSL de terceros. Obtuve un certificado válido del portal para desarrolladores de Apple, pero sin la clave privada. Luego probé la herramienta de certificado de Windows para exportar sin gran éxito. Pérdida de tiempo. Comience su Mac.
Luego utilicé la aplicación de ejemplo AmazonMobilePush para obtener un token de dispositivo. Debido a que el identificador de paquete de la demostración no coincide con mi certificado, el punto final no era válido. En cada envío SNS, el punto final se deshabilitó (falso). Al final, la causa fue obvia, pero aún pierdo un tiempo precioso.
Para mí, obtenía el "token de plataforma asociado con el punto final no válido" porque mis puntos finales de la aplicación SNS Platform no estaban configurados correctamente. Específicamente, la consola SNS no estaba leyendo correctamente las credenciales de mi archivo .p12 a pesar de que contenía el certificado correcto y la clave privada. La solución, basada en esta publicación , era crear un segundo archivo .p12 que contenía el certificado y ninguna clave. Cargué las credenciales del primer archivo .p12 y luego cargué el segundo archivo .p12 de las credenciales. Pude ver la cadena cert cambiar cuando lo hice, y después no tuve ningún problema.
Si está creando un punto final de producción, SNS le advertirá acerca de los certificados que no coinciden, pero no hace tal comprobación para los puntos finales de desarrollo. La única forma en que sabrá que el punto extremo está borrado es cuando obtiene el error de token de plataforma.
Espero que esto ayude a alguien por ahí, ya que me llevó a la distracción.
Puede crear un nuevo tema SNS como push-notification-failures
y luego asociar el evento "Delivery Failures" de sus aplicaciones APNS / APNS_SANDBOX. Suscríbase al evento por correo electrónico (y confirme) y obtendrá información de depuración útil sobre fallas. Todo esto se puede lograr a través de la consola SNS y no requiere llamadas API para realizar.
Probablemente valga la pena suscribir un punto final HTTP a este tema SNS y registrar todas las fallas de entrega para que tenga datos históricos para trabajar y depurar problemas de producción.
Por ejemplo, un FailureMessage
de entrega de "token de plataforma asociado con el punto final no es válido" significa que está enviando un mensaje de APNS_SANDBOX a un dispositivo registrado APNS o viceversa. Esto puede significar que tiene una configuración APNS incorrecta para su sistema de compilación. (Tenemos un problema frustrante de los binarios construidos por los desarrolladores usando APNS_SANDBOX vs. los binarios construidos por TestFlight usando APNS para pruebas locales y control de calidad, que es lo que me llevó por esta ruta).
Si obtiene el error, el End Point is Disabled
, use el código a continuación para habilitar el endPoint y luego presione Notificación usando las credenciales de Amazon:
*//Enable Device*
var sns = new AmazonSimpleNotificationServiceClient("AwsAccesskeyId", "AwsSecrteAccessKey", RegionEndpoint.USWest1);
Dictionary<string, string> objDictCheckEndpointEnable = new Dictionary<string, string>();
objDictCheckEndpointEnable.Add("Enabled", "False");
sns.SetEndpointAttributes(new SetEndpointAttributesRequest
{
Attributes = objDictCheckEndpointEnable,
EndpointArn = "AwsEndPointArn" //This is Device End Point Arn
});
*//End*
Tuve el mismo problema. Esto es lo que hice:
- exportar el CERTIFICADO COMPLETO desde Keychain Access a un archivo .p12
exportar la CLAVE PRIVADA desde Keychange Access a un archivo * private.p12
use openssl con el archivo .cer descargado (desde el Centro de miembros para desarrolladores de iOS) para crear un certificado .pem público
use openssl con el archivo * private.p12 generado para crear un archivo de clave .pem privado
- En AWS SNS crea una nueva aplicación. Dale un nombre. Elija Apple Development.
Elija el CERTIFICADO COMPLETO de Keychain Access con una extensión .p12 y escriba la frase de contraseña que eligió al exportar desde Keychain Access Copie el contenido del archivo público CERTIFICATE .pem al área de texto etiquetada como "Certificado", incluidas las líneas de inicio y finalización :
-----BEGIN CERTIFICATE----- -----END CERTIFICATE-----
Copie solo la parte del archivo .pem de la clave privada que comienza y termina con las siguientes líneas, en el área de texto con la etiqueta "Clave privada":
-----BEGIN RSA PRIVATE KEY----- -----END RSA PRIVATE KEY-----
Uso Cordova con phonegap-plugin-push 1.4.4, pero mi problema no tiene nada que ver con phonecap. Aparte de un poco de confusión sobre lo anterior, lo que finalmente me gustó fue abrir mi proyecto en XCode, encontrar el objetivo para mi proyecto y luego habilitar las notificaciones automáticas. Esto agrega automáticamente el derecho de "Notificaciones Push" a la ID de la aplicación. La próxima vez que se instale la aplicación en su dispositivo, la notificación de inserción debería funcionar. Al menos lo hizo por mí.
¡Espero que esto pueda salvar a alguien que tenga el mismo problema que yo un 1/2 día de trabajo! :)