FCM con AWS SNS


Estoy usando AWS recursos para mi proyecto Android, estoy planeando agregar el servicio de notificaciones push para mi proyecto con AWS SNS.hay pocas preguntas que me molestan mucho. No encontré ninguna pregunta al respecto, excepto una o dos, pero con explicaciones poco claras.

1.¿AWS soporta FCM? SNS trabajar con GCM. Pero Google recomienda usar FCM en lugar de GCM. No encontré AWS soportando FCM.

2.Do AWS almacenar mensajes (o datos) en sus bases de datos incluso después de enviar notificaciones push?

3.Intenté poner la clave de la api de FCM en la plataforma de aplicación SNS, está mostrando parámetros no válidos ¿por qué?

Author: Naroju, 2016-07-11

6 answers

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 está enviando data cargas útiles al dispositivo Android, no se procesarán a menos que implemente un servicio del lado del cliente que extienda FirebaseMessagingService. El generador de mensajes JSON predeterminado en la consola de AWS envía data mensajes, que serán ignorados por su aplicación a menos que se implemente el servicio mencionado anteriormente. Para evitar esto para las pruebas iniciales, puede proporcionar una carga útil personalizada notification que recibirá su dispositivo (siempre que su aplicación no esté en primer plano)

Hay Instrucciones de migración 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, seleccionando Google Cloud Messaging (GCM) como la Plataforma de Notificaciones Push y proporcionando su clave API de servidor en el campo Clave API .
  2. Seleccione la Aplicación de plataforma y haga clic en el botón Create platform endpoint.
  3. Proporcione el InstanceID ( Device Token) generado por su aplicación. Debe extender el FirebaseInstanceIDService y Anular el método onTokenRefresh para vea esto dentro de su aplicación de Android. Una vez que haya hecho esto, desinstale y vuelva a instalar su aplicación y su token deben imprimirse en la consola de depuración en Android Studio en el primer arranque.
  4. Haga clic en el botón Add endpoint.
  5. Haga clic en el enlace 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 el punto final.
  7. Seleccione el formato de mensaje JSON y haga clic en Botón Generador de mensajes JSON.
  8. Introduzca un mensaje de prueba y haga clic en el botón Generar JSON
  9. Ahora viene la parte de "gotcha".

El mensaje que se genera por SNS será de la forma:

{
"GCM": "{ \"data\": { \"message\": \"test message\" } }"
}

Como mencionamos anteriormente, data las cargas útiles serán ignoradas si no se ha implementado ningún servicio para recibirlas. Nos gustaría probar sin escribir demasiado código, por lo que en su lugar deberíamos enviar una carga útil notification. Para hacer esto, simplemente cambie la Mensaje JSON para leer:

{
"GCM": "{ \"notification\": { \"text\": \"test message\" } }"
}

Una vez que haya hecho esto, asegúrese de que su aplicación no se esté ejecutando en el dispositivo y presione 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 de Amazon SNS, sin embargo, todos los ejemplos parecen usar la carga útil data, por lo que debe tenerlo en cuenta y generar una carga útil adecuada a su caso de uso.

 140
Author: Nathan Dunn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-28 02:58:45

Ahora puedes ir a tu consola firebase ( https://console.firebase.google.com / ) seleccione su proyecto, haga clic en el icono de engranaje y elija configuración del proyecto, luego haga clic en la pestaña de mensajería 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ú aún lo categoriza bajo GCM

Aquí está la imagen para su referencia:

introduzca la descripción de la imagen aquí

Tenga en cuenta que puede eliminar "accidentalmente" sus claves de servidor, pero la clave de servidor heredada no se puede eliminar. Además, si hace clic en el botón agregar clave de servidor, obtendrá una nueva clave de servidor DEBAJO de la primera, ¡SIN PREVIO AVISO! ...Buen trabajo de Google ;)

 10
Author: Reza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-22 16:57:20

Intenté usar la solución con carga útil de notificación en lugar de datos, pero no recibí notificaciones push en el dispositivo móvil. He encontrado este tutorial https://youtu.be/iBTFLu30dSg con subtítulos en inglés de cómo usar FCM con AWS SNS paso a paso y ejemplo de cómo enviar notificaciones push desde la consola de AWS e implementarlo en php con aws php sdk. Me ayudó mucho.

 5
Author: Arbron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-12 12:06:28

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\" } }"
}
 2
Author: Shao Yuan Chew Chia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-08 03:45:19

Una nota adicional a la gran respuesta de Nathan Dunn. Cómo enviar datos con la notificación de 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)
    {
    }
}
 1
Author: Adys,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-07 10:12:35

Me llevó un tiempo averiguar cómo enviar la notificación con la carga útil correcta (publicar en el tema). Así que 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);
}    
 0
Author: Alexey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-20 07:41:45