Estoy utilizando los recursos de AWS
para mi proyecto de Android, estoy planeando agregar el servicio de notificación de inserción para mi proyecto con AWS SNS
. Hay algunas preguntas que me molestan mucho. No encontré ninguna pregunta con respecto a estos, excepto uno o dos, pero con explicaciones poco claras.
1. ¿ AWS
compatible con FCM
? SNS
trabaja con GCM
. Pero Google recomienda usar FCM en lugar de GCM
. No encontré AWS
apoyando FCM
.
2. ¿ AWS
almacena mensajes (o datos) en sus bases de datos incluso después de enviar notificaciones push?
3.Intenté poner FCM api key en la plataforma de aplicación SNS, muestra los parámetros no válidos ¿por qué?
FCM es compatible con GCM. Los pasos para configurar FCM en AWS son idénticos al procedimiento de configuración de GCM y (al menos por el momento) FCM funciona de forma transparente con GCM y SNS con respecto a la configuración del lado del servidor.
Sin embargo , si envía cargas útiles de data
al dispositivo Android, no se procesarán a menos que implemente un servicio del lado del cliente que amplíe FirebaseMessagingService
. El generador de mensajes JSON predeterminado en la consola de AWS envía mensajes de data
, que serán ignorados por su aplicación a menos que se implemente el servicio antes mencionado. Para evitar esto para las pruebas iniciales, puede proporcionar una carga útil de notification
personalizada que recibirá su dispositivo (siempre que su aplicación no esté en primer plano)
Existen instrucciones de migración de GCM-FCM proporcionadas por Google, sin embargo, los cambios que debe realizar son predominantemente en el lado de la aplicación.
Los pasos que debe seguir para probar GCM / FCM en su aplicación con SNS son:
FirebaseInstanceIDService
y onTokenRefresh
método onTokenRefresh
para ver esto dentro de tu aplicación de Android. Una vez que haya hecho esto , desinstale y vuelva a instalar su aplicación y su token se debe imprimir a la consola Debug en Android Studio en el primer arranque. El mensaje que genera el SNS será de la siguiente forma:
{ "GCM": "{ \"data\": { \"message\": \"test message\" } }" }
Como mencionamos anteriormente, data
cargas útiles de data
se ignorarán si no se ha implementado ningún servicio para recibirlas. Nos gustaría probar sin escribir demasiado código, por lo que deberíamos enviar una carga útil de notification
. Para hacer esto, simplemente cambie el mensaje JSON para leer:
{ "GCM": "{ \"notification\": { \"text\": \"test message\" } }" }
Una vez que hayas hecho esto, asegúrate de que tu aplicación no se esté ejecutando en el dispositivo y presiona el botón Publicar mensaje . Ahora debería ver una notificación emergente en su dispositivo.
Por supuesto, puede hacer todo esto programáticamente a través de la API SNS de Amazon, sin embargo, todos los ejemplos parecen usar la carga de data
por lo que debe tener esto en cuenta y generar una carga útil adecuada para su caso de uso.
Ahora puede ir a la consola de su Firebase ( https://console.firebase.google.com/ ) seleccione su proyecto, haga clic en el ícono de ajustes y seleccione la configuración del proyecto, luego haga clic en la pestaña de mensajes en la nube …
Verá la Clave de Servidor heredada que es la Clave API de GCM y tendrá la opción de generar nuevas Claves de Servidor que son las versiones de FCM
SNS aceptará ambas versiones, pero su opción de menú todavía está categorizándola bajo GCM
Aquí está la imagen para su referencia:
Tenga en cuenta que puede eliminar “accidentalmente” las claves del servidor, pero la clave del servidor heredado no se puede eliminar. Además, si hace clic en el botón Agregar clave del servidor, obtendrá una nueva clave de servidor A CONTINUACIÓN de la primera, ¡SIN NINGUNA ADVERTENCIA! … Buen trabajo Google;)
Traté de usar la solución con la carga de notificación en lugar de los datos, pero no recibí notificaciones push en el dispositivo móvil. Encontré este tutorial https://youtu.be/iBTFLu30dSg con subtítulos en inglés sobre cómo usar FCM con AWS SNS paso a paso y un ejemplo de cómo enviar notificaciones push desde la consola de AWS e implementarlo en php con aws php sdk. Me ayudó mucho.
Solo una nota adicional a la respuesta de Nathan Dunn: para agregar sonido use el siguiente mensaje JSON
{ "GCM": "{ \"notification\": { \"text\": \"test message\",\"sound\":\"default\" } }" }
Una nota más adicional a la gran respuesta de Nathan Dunn. Cómo enviar datos con la notificación del SNS a Firebase.
Necesitamos agregar datos al Json (dentro de la notificación):
{ "default": “any value", "GCM": "{ \"notification\": { \"body\": \”message body\”, \”title\”: \”message title \”, \"sound\":\"default\" } , \"data\" : {\”key\" : \”value\", \”key2\" : \”value\” } }” }
En su implementación de FirebaseMessagingService (ejemplo de Xamarin)
public override void OnMessageReceived(RemoteMessage message) { try { var body = message?.GetNotification()?.Body; var title = message?.GetNotification()?.Title; var tag = message?.GetNotification()?.Tag; var sound = message?.GetNotification()?.Sound; var data = message?.Data foreach (string key in data.Keys) { // get your data values here } } catch (Exception e) { } }
Me tomó un tiempo averiguar cómo enviar la notificación con la carga útil correcta (publicar en el tema). Entonces lo pondré aquí.
private void PublishToTopic(string topicArn) { AmazonSimpleNotificationServiceClient snsClient = new AmazonSimpleNotificationServiceClient(Amazon.RegionEndpoint.EUWest1); PublishRequest publishRequest = new PublishRequest(); publishRequest.TopicArn = topicArn; publishRequest.MessageStructure = "json"; string payload = "\\\"data\\\":{\\\"text\\\":\\\"Test \\\"}"; publishRequest.Message = "{\"default\": \"default\",\"GCM\":\"{" + payload + "}\"}"; PublishResponse publishResult = snsClient.Publish(publishRequest); }