FCM con AWS SNS

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:

  1. Cree una aplicación de plataforma en SNS , seleccione Google Cloud Messaging (GCM) como plataforma de notificación de inserción y proporcione su clave de API de servidor en el campo de clave de API .
  2. Seleccione la aplicación de la plataforma y haga clic en el botón Crear punto final de la plataforma .
  3. Proporcione el InstanceID ( token de dispositivo ) generado por su aplicación. Debes extender 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.
  4. Haga clic en el botón Agregar punto final .
  5. Haga clic en el enlace de ARN para su aplicación de plataforma.
  6. Seleccione el punto final recién creado para su dispositivo y haga clic en el botón Publicar en punto final .
  7. Seleccione el formato de mensaje JSON y haga clic en el botón del generador de mensajes JSON .
  8. Ingrese un mensaje de prueba y haga clic en el botón Generar JSON
  9. Ahora viene la “parte gotcha”.

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:

enter image description here

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