Mensaje de varias plataformas a través de AWS SNS con aws-ruby-sdk
Estoy tratando de usar el SDK Ruby de Amazon para enviar notificaciones push con atributos adicionales para diferentes plataformas, a saber, APNS y GCM (dispositivos Apple y Android), pero no puedo encontrar una forma de enviar la estructura de mensajes documentada usando la API del SDK.
Para enviar un mensaje con diferentes cargas útiles para GCM y APNS, los documentos que encontré sugieren la siguiente estructura:
- Instalar Calabash-Android causa error en OS X Mavericks
- Iniciar el entorno de desarrollo de rails en android
- ¿Cómo puedo verificar la facturación de Android en la aplicación con un servidor con Ruby?
- ¿Qué solución basada en plataformas móviles basada en Ruby utilizar?
- Cifrar datos en Android con un archivo RSA public.pem generado en Ruby
{ "APNS": { "aps": { "alert": "someone set us up the bomb" } }, "GCM": { "data": { "message": "we get signal" } } }
Esperaría que SNS envíe correctamente la carga útil específica de la plataforma a los puntos finales de la plataforma correctos, pero en su lugar el mensaje a, por ejemplo, un dispositivo android, también incluye la carga útil APNS – incluye el cuerpo completo del mensaje.
Así es como envío el mensaje:
sns = AWS::SNS::Client.new sns.publish( target_arn: endpoint_arn, message: { GCM: ..., APNS: ... }.to_json )
La documentación disponible, particularmente para el ruby sdk, no parece ser tan detallada. ¿Estoy incorrecto en mi supuesto de que la carga útil debe distribuirse correctamente dependiendo de la plataforma de punto final? ¿Hay una mejor manera de lograr lo que estoy tratando de hacer?
- Obtener "La aplicación no se inició (RuntimeError)" al intentar ejecutar pruebas calabash-android en el dispositivo
- Error al crear la extensión nativa de Gem al instalar Calabash Android en Ubuntu
- No se puede ejecutar la aplicación de Rhodes de ejemplo
- El cuadro de diálogo del sistema de pruebas de Calabash muestra e interactúa con él
- ActionController InvalidAuthenticityToken en Api :: V1 :: UsersController # create
Probablemente ya has descubierto esto, pero aquí es cómo funciona en PHP. Probablemente la estructura del mensaje es la misma en Ruby:
publish(array( 'TopicArn' => 'YOUR_TOPIC_ARN', 'Message' => '{ "default": "YOUR_MESSAGE", "email": "YOUR_MESSAGE", "sqs": "YOUR_MESSAGE", "http": "YOUR_MESSAGE", "https": "YOUR_MESSAGE", "sms": "YOUR_MESSAGE", "APNS": "{\"aps\":{\"alert\": \"YOUR_MESSAGE\",\"sound\":\"default\", \"badge\":\"1\"} }", "GCM": "{ \"data\": { \"message\": \"YOUR_MESSAGE\" } }", "ADM": "{ \"data\": { \"message\": \"YOUR_MESSAGE\" } }" }', 'MessageStructure' => 'json' ));
Vieja historia, pero aquí es cómo me las arreglé para hacerlo, después @ inspiración user3719626:
client.publish({ target_arn: @endpoint_arn, message: { "default" => "Default message. Used only if the target does not support any other format.", "APNS" => { "aps" => { "alert" => "Whatever!", "url" => "stackoverflow.com", } }.to_json, "GCM" => { "data" => { "message" => "Whatever!", "url" => "stackoverflow.com" } }.to_json, }.to_json, message_structure: 'json', })
Notas:
-
client
es una instancia deAWS::SNS::Client
. -
@endpoint_arn
es una cadena que contiene el identificador ARN de punto final / tema de destino. -
message
debe ser una cadena, y aquí debe ser una cadena JSON. - Cada clave de plataforma debe apuntar a una cadena JSON también. Así que cada valor de la plataforma es "JSONified" dos veces.