php - services - sns precios
Cómo enviar parámetros adicionales en la carga útil a través de Amazon SNS Push Notification (4)
Esto es algo nuevo que estoy preguntando, ya que no tengo ninguna respuesta al respecto en SO.
Estoy usando Amazon SNS Push para enviar push a mis dispositivos registrados, todo funciona bien, puedo registrar dispositivos en mi aplicación, puedo enviar push, etc. El problema que estoy enfrentando es que quiero abrir una página específica Cuando abro mi aplicación a través de push. Quiero enviar algunos parámetros adicionales con la carga útil, pero no puedo hacer eso.
Probé este enlace: - http://docs.aws.amazon.com/sns/latest/api/API_Publish.html
solo tenemos una clave, es decir, "Mensaje", en la que podemos pasar la carga útil hasta donde sé.
Quiero pasar una carga útil como esta:
{
aps = {
alert = "My Push text Msg";
};
"id" = "123",
"s" = "section"
}
o cualquier otro formato está bien, solo quería pasar 2-3 valores junto con la carga útil para poder usarlos en mi aplicación.
El código que estoy usando para enviar push es: -
// Load the AWS SDK for PHP
if($_REQUEST)
{
$title=$_REQUEST["push_text"];
if($title!="")
{
require ''aws-sdk.phar'';
// Create a new Amazon SNS client
$sns = Aws/Sns/SnsClient::factory(array(
''key'' => ''...'',
''secret'' => ''...'',
''region'' => ''us-east-1''
));
// Get and display the platform applications
//print("List All Platform Applications:/n");
$Model1 = $sns->listPlatformApplications();
print("/n</br></br>");*/
// Get the Arn of the first application
$AppArn = $Model1[''PlatformApplications''][0][''PlatformApplicationArn''];
// Get the application''s endpoints
$Model2 = $sns->listEndpointsByPlatformApplication(array(''PlatformApplicationArn'' => $AppArn));
// Display all of the endpoints for the first application
//print("List All Endpoints for First App:/n");
foreach ($Model2[''Endpoints''] as $Endpoint)
{
$EndpointArn = $Endpoint[''EndpointArn''];
//print($EndpointArn . "/n");
}
//print("/n</br></br>");
// Send a message to each endpoint
//print("Send Message to all Endpoints:/n");
foreach ($Model2[''Endpoints''] as $Endpoint)
{
$EndpointArn = $Endpoint[''EndpointArn''];
try
{
$sns->publish(array(''Message'' => $title,
''TargetArn'' => $EndpointArn));
//print($EndpointArn . " - Succeeded!/n");
}
catch (Exception $e)
{
//print($EndpointArn . " - Failed: " . $e->getMessage() . "!/n");
}
}
}
}
?>
Cualquier ayuda o idea será apreciada. Gracias por adelantado.
Desde una función Lambda (Node.js) la llamada debe ser:
exports.handler = function(event, context) {
var params = {
''TargetArn'' : $EndpointArn,
''MessageStructure'' : ''json'',
''Message'' : JSON.stringify({
''default'' : $title,
''APNS'' : JSON.stringify({
''aps'' : {
''alert'' : $title,
''badge'' : ''0'',
''sound'' : ''default''
},
''id'' : ''123'',
''s'' : ''section'',
}),
''APNS_SANDBOX'' : JSON.stringify({
''aps'' : {
''alert'' : $title,
''badge'' : ''0'',
''sound'' : ''default''
},
''id'' : ''123'',
''s'' : ''section'',
})
})
};
var sns = new AWS.SNS({apiVersion: ''2010-03-31'', region: ''us-east-1'' });
sns.publish(params, function(err, data) {
if (err) {
// Error
context.fail(err);
}
else {
// Success
context.succeed();
}
});
}
Puede simplificar especificando solo un protocolo: APNS
o APNS_SANDBOX
.
Es fácil pasar por alto el hecho de que necesita agregar APNS_SANDBOX y APNS para realizar pruebas locales.
La documentación de Amazon SNS todavía no se encuentra aquí, con algunos consejos sobre cómo formatear un mensaje para usar una carga útil personalizada. Esta pregunta frecuente explica cómo hacerlo, pero no proporciona un ejemplo.
La solución es publicar la notificación con el parámetro MessageStructure
establecido en json
y un parámetro Message
que está codificado en json, con una clave para cada protocolo de transporte. Siempre debe haber una clave default
también, como alternativa.
Este es un ejemplo de notificaciones de iOS con una carga útil personalizada:
array(
''TargetArn'' => $EndpointArn,
''MessageStructure'' => ''json'',
''Message'' => json_encode(array(
''default'' => $title,
''APNS'' => json_encode(array(
''aps'' => array(
''alert'' => $title,
),
// Custom payload parameters can go here
''id'' => ''123'',
''s'' => ''section''
))
))
);
Lo mismo ocurre con otros protocolos también. El formato del mensaje json_encoded debe ser así (pero puede omitir claves si no usa el transporte):
{
"default": "<enter your message here>",
"email": "<enter your message here>",
"sqs": "<enter your message here>",
"http": "<enter your message here>",
"https": "<enter your message here>",
"sms": "<enter your message here>",
"APNS": "{/"aps/":{/"alert/": /"<message>/",/"sound/":/"default/"} }",
"APNS_SANDBOX": "{/"aps/":{/"alert/": /"<message>/",/"sound/":/"default/"} }",
"GCM": "{ /"data/": { /"message/": /"<message>/" } }",
"ADM": "{ /"data/": { /"message/": /"<message>/" } }"
}
Soy demasiado inexperto para comentar aquí, pero me gustaría llamar la atención de la gente sobre el json_encode anidado. Esto es importante sin que la cadena APNS no sea analizada por Amazon y solo enviará el valor de mensaje predeterminado.
Estaba haciendo lo siguiente:
$message = json_encode(array(
''default''=>$msg,
''APNS''=>array(
''aps''=>array(
''alert''=>$msg,
''sound''=>''default''
),
''id''=>$id,
''other''=>$other
)
)
);
Pero esto no funcionará. DEBE json_encode la matriz en ''APNS'' por separado como se muestra en la respuesta de felixdv. No me preguntes por qué los resultados se ven exactamente iguales en mi registro de consola. Aunque los documentos muestran que la cadena json debajo de la clave ''APNS'' debería estar envuelta en "", entonces sospeche que esto tiene algo que ver con eso.
docs.aws.amazon.com/sns/latest/dg/…
No se deje engañar, ya que el JSON se validará sin estas comillas dobles.
Tampoco estoy seguro sobre el comentario de emkman. Sin la clave ''predeterminada'' en la estructura anterior que se envía a un ARN de punto final, recibiría un error de AWS.
Espero que se acelere la tarde de alguien.
EDITAR
Posteriormente eliminó la necesidad de anidar los json_encodes: crea comillas dobles escapadas que, a pesar de que los documentos dicen que no se requieren en la API, son para toda la cadena de caracteres para GCM y están por encima de la matriz secundaria en APNS para Apple. Esta puede ser mi implementación, pero está prácticamente lista para usar con el SDK de PHP de AWS y fue la única forma de enviar datos personalizados.