Подтвердить что ты не робот

Как отправить дополнительные параметры в полезной нагрузке через уведомление 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");
          }
        }
    }
}
?>

Любая помощь или идея будут оценены. Спасибо заранее.

4b9b3361

Ответ 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 для тестирования локально.