Это что-то новое, о котором я спрашиваю, поскольку у меня нет никаких ответов на него на 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'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"); } } } } ?>
Любая помощь или идея будут оценены. Заранее спасибо.
Документации по SNS Amazon по-прежнему не хватает, с небольшим количеством указателей на то, как форматировать сообщение для использования пользовательской полезной нагрузки. В этом FAQ объясняется, как это сделать, но не приводится пример.
Решение заключается в публикации уведомления с параметром MessageStructure
установленным в json
и параметром 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>\" } }" }
Из функции Lambda (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
.
Я слишком неопытен, чтобы комментировать здесь, но я хотел бы привлечь внимание людей к вложенному json_encode. Это важно без него, строка APNS не будет анализироваться Amazon, и она отправит только значение сообщения по умолчанию.
Я делал следующее:
$message = json_encode(array( 'default'=>$msg, 'APNS'=>array( 'aps'=>array( 'alert'=>$msg, 'sound'=>'default' ), 'id'=>$id, 'other'=>$other ) ) );
по$message = json_encode(array( 'default'=>$msg, 'APNS'=>array( 'aps'=>array( 'alert'=>$msg, 'sound'=>'default' ), 'id'=>$id, 'other'=>$other ) ) );
по$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 и был единственным способом заставить его отправлять пользовательские данные.