Как отправить дополнительные параметры в полезной нагрузке через уведомление Amazon SNS Push
Это что-то новое, о котором я спрашиваю, поскольку у меня нет ответов на него на SO.
Я использую Amazon SNS Push для отправки push на мои зарегистрированные устройства, все работает хорошо, я могу регистрировать устройства в своем первом приложении, отправлять push и т.д. Проблема в том, что я хочу открыть конкретную страницу, когда я открываю приложение через push. Я хочу отправить дополнительные параметры с полезной нагрузкой, но я не могу этого сделать.
Я пробовал эту ссылку: http://docs.aws.amazon.com/sns/latest/api/API_Publish.html
у нас есть только один ключ, т.е. "Сообщение", в котором мы можем передать полезную нагрузку, насколько я знаю.
Я хочу передать полезную нагрузку следующим образом: -
{
aps = {
alert = "My Push text Msg";
};
"id" = "123",
"s" = "section"
}
или любой другой формат в порядке, я просто хотел передать 2-3 значения вместе с полезной нагрузкой, чтобы я мог использовать их в своем приложении.
Код, который я использую для отправки push,: -
// 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 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");
}
}
}
}
?>
Любая помощь или идея будут оценены. Спасибо заранее.
Ответы
Ответ 1
Документация по SNS Amazon по-прежнему отсутствует, с несколькими указателями на то, как форматировать сообщение для использования пользовательской полезной нагрузки. В этом FAQ объясняется, как это сделать, но не приводится пример.
Решение состоит в публикации уведомления с параметром MessageStructure
, установленным на json
и a Message
, который кодируется json, с ключом для каждого транспортного протокола. В качестве резерва всегда должен быть ключ default
.
Это пример уведомлений iOS с пользовательской полезной нагрузкой:
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'
))
))
);
То же самое касается и других протоколов. Формат сообщения json_encoded должен быть таким (но вы можете опустить ключи, если вы не используете транспорт):
{
"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>\" } }"
}
Ответ 2
Из функции лямбда (Node.js) вызов должен быть:
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();
}
});
}
Вы можете упростить, указав только один протокол: APNS
или APNS_SANDBOX
.
Ответ 3
Я слишком неопытен, чтобы комментировать здесь, но я хотел бы привлечь внимание людей к вложенному json_encode. Это важно без него, строка APNS не будет анализироваться Amazon, и она отправит только значение сообщения по умолчанию.
Я делал следующее:
$message = json_encode(array(
'default'=>$msg,
'APNS'=>array(
'aps'=>array(
'alert'=>$msg,
'sound'=>'default'
),
'id'=>$id,
'other'=>$other
)
)
);
Но это не сработает. Вы ДОЛЖНЫ json_encode массива в разделе "APNS" отдельно, как показано в ответе felixdv. Не спрашивайте меня, почему, поскольку выходы выглядят точно так же в моем журнале консоли. Хотя документы показывают, что строка json под ключом APNS должна быть завернута в "", так что подозревайте, что это имеет к этому какое-то отношение.
http://docs.aws.amazon.com/sns/latest/dg/mobile-push-send-custommessage.html
Не обманывайте себя, хотя JSON будет проверять штраф без этих двойных кавычек.
Также я не уверен в комментариях emkman. Без ключа "по умолчанию" в вышеприведенной структуре, отправляемой в одну конечную точку ARN, я получал бы ошибку от AWS.
Надеюсь, что скорой вечер ускорится.
ИЗМЕНИТЬ
Впоследствии выяснилось, что нужно вложить json_encodes - он создает скрытые двойные кавычки, которые, несмотря на то, что в API, требуемом для API, для всей строки для GCM и, как указано выше, под массивом под APNS для apple. Это может быть моя реализация, но в значительной степени из коробки с использованием SDK для PHP AWS и был единственным способом заставить его отправлять пользовательские данные.
Ответ 4
Легко пропустить, что вам нужно добавить APNS_SANDBOX, а также APNS для тестирования локально.