android - change - gcm a fcm
FCM con AWS SNS (8)
Estoy usando recursos de
AWS
para mi proyecto de Android, estoy planeando agregar un servicio de notificación push para mi proyecto con
AWS SNS
. Hay algunas preguntas que me molestan mucho.
No encontré ninguna pregunta al respecto, excepto una o dos pero con explicaciones poco claras.
1. ¿
AWS
admite
FCM
?
SNS
trabaja con
GCM
.
Pero Google recomienda usar FCM en lugar de
GCM
.
No encontré
AWS
compatible con
FCM
.
¿
AWS
almacena mensajes (o datos) en sus bases de datos incluso después de enviar notificaciones push?
3.Traté de poner la clave de API FCM en la plataforma de aplicación SNS, ¿muestra parámetros no válidos por qué?
Ahora puede ir a su consola de Firebase ( https://console.firebase.google.com/ ) seleccione su proyecto, haga clic en el ícono de ajustes y elija 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ú sigue clasificándola en GCM
Aquí hay una 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 de servidor, obtendrá una nueva clave de servidor DEBAJO de la primera, ¡SIN ADVERTENCIA! ... Buen trabajo Google;)
Amazon admite FCM ya que todo el código anterior se ha migrado de GCM a FCM. A continuación el artículo explica en detalle.
FCM es compatible con versiones anteriores de 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 cargas de
data
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 mensajes de
data
, que su aplicación ignorará a menos que se implemente el servicio mencionado anteriormente.
Para evitar esto para las pruebas iniciales, puede proporcionar una carga de
notification
personalizada 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 del lado de la aplicación.
Los pasos que debe seguir para probar GCM / FCM en su aplicación con SNS son:
- Cree una aplicación de plataforma en SNS , seleccionando Google Cloud Messaging (GCM) como la plataforma de notificaciones push y proporcionando su clave de API del servidor en el campo Clave de API .
- Seleccione la aplicación de plataforma y haga clic en el botón Crear punto final de plataforma .
-
Proporcione el InstanceID (
Token de dispositivo
) generado por su aplicación.
Debe ampliar el servicio
FirebaseInstanceIDService
yonTokenRefresh
métodoonTokenRefresh
para ver 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 debe imprimirse en la consola de depuración en Android Studio en el primer arranque. - Haga clic en el botón Agregar punto final .
- Haga clic en el enlace ARN para su aplicación de plataforma.
- Seleccione el Punto final recién creado para su dispositivo y haga clic en el botón Publicar en punto final .
- Seleccione el formato de mensaje JSON y haga clic en el botón generador de mensajes JSON .
- Ingrese un mensaje de prueba y haga clic en el botón Generar JSON
- Ahora viene la "parte gotcha".
El mensaje generado por SNS tendrá la forma:
{
"GCM": "{ /"data/": { /"message/": /"test message/" } }"
}
Como mencionamos anteriormente,
data
cargas 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
notification
carga útil.
Para hacer esto, simplemente cambie el 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 mediante programación a través de la API de Amazon SNS, sin embargo, todos los ejemplos parecen utilizar la carga útil de
data
por lo que debe tener esto en cuenta y generar una carga útil adecuada para su caso de uso.
Me tomó un tiempo descubrir 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);
}
Para responder las preguntas:
- AWS SNS admite FCM.
- No AWS no almacena mensajes después de enviar notificaciones push.
Para obtener un tutorial detallado sobre cómo configurar FCM con SNS, lea este artículo.
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/" } }"
}
Traté de usar una solución con carga de notificación en lugar de 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.
Una nota adicional más 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)
{
}
}