it-swarm.com.de

So senden Sie zusätzliche Parameter in der Nutzlast über Amazon SNS Push Notification

Das ist etwas Neues, was ich frage, da ich auf SO keine Antworten dafür habe.

Ich verwende Amazon SNS Push, um Push an meine registrierten Geräte zu senden. Alles funktioniert gut. Ich kann Geräte auf meiner App registrieren, kann Push usw. senden Wenn ich meine App über Push öffne. Ich möchte einige zusätzliche Parameter mit der Nutzlast senden, aber ich kann das nicht.

Ich habe diesen Link ausprobiert: - http://docs.aws.Amazon.com/sns/latest/api/API_Publish.html

wir haben nur einen Schlüssel, d. h. "Nachricht", in dem wir die Nutzlast weitergeben können, soweit ich weiß.

ich möchte eine Nutzlast wie folgt übergeben: - 

{
    aps = {
            alert = "My Push text Msg";
          };
    "id" = "123",
    "s" = "section"
}

oder jedes andere Format ist in Ordnung, ich wollte nur 2-3 Werte zusammen mit der Nutzlast übergeben, damit ich sie in meiner App verwenden kann.

Der Code, den ich für das Senden von Push verwende, lautet:

// 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");
          }
        }
    }
}
?>

Jede Hilfe oder Idee wird geschätzt. Danke im Voraus.

26
mAc

Die Amazon SNS-Dokumentation fehlt hier immer noch, mit wenigen Hinweisen zum Formatieren einer Nachricht für die Verwendung einer benutzerdefinierten Payload. Dieses FAQ erklärt, wie es geht, bietet aber kein Beispiel.

Die Lösung besteht darin, die Benachrichtigung mit dem Parameter MessageStructure zu veröffentlichen, der auf json gesetzt ist, und einem Message-Parameter, der json-codiert ist, mit einem Schlüssel für jedes Transportprotokoll. Als Fallback muss immer auch eine default-Taste vorhanden sein. 

Dies ist ein Beispiel für iOS-Benachrichtigungen mit einer benutzerdefinierten Nutzlast:

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'
        ))

    ))
);

Dasselbe gilt auch für andere Protokolle. Das Format der json_encoded-Nachricht muss wie folgt aussehen (Sie können jedoch Schlüssel auslassen, wenn Sie den Transport nicht verwenden):

{ 
    "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>\" } }" 
}
58
felixdv

Von einer Lambda-Funktion (Node.js) sollte der Aufruf sein:

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();
    }
  });
}

Sie können dies vereinfachen, indem Sie nur ein Protokoll angeben: APNS oder APNS_SANDBOX.

6
rjobidon

Ich bin zu unerfahren, um hier etwas zu kommentieren, aber ich möchte die Leute auf den verschachtelten json_encode aufmerksam machen. Dies ist wichtig, ohne dass die APNS-Zeichenfolge nicht von Amazon analysiert wird und es wird nur der Standardnachrichtenwert gesendet.

Ich habe folgendes gemacht:

$message = json_encode(array(
   'default'=>$msg,
   'APNS'=>array(
      'aps'=>array(
         'alert'=>$msg,
         'sound'=>'default'
         ),
         'id'=>$id,
         'other'=>$other
       )
     )
   );

Das wird aber nicht funktionieren. Sie MÜSSEN das Array unter 'APNS' separat jenieren, wie in der Antwort von felixdv gezeigt. Fragen Sie mich nicht, warum die Ausgaben in meinem Konsolenprotokoll genau gleich aussehen. Obwohl die Docs zeigen, dass die json-Zeichenfolge unter der Taste "APNS" in "" eingeschlossen werden sollte, so hat dies den Verdacht, dass dies etwas damit zu tun hat.

http://docs.aws.Amazon.com/sns/latest/dg/mobile-Push-send-custommessage.html

Lassen Sie sich nicht täuschen, da JSON ohne diese doppelten Anführungszeichen einwandfrei validiert wird.

Ich bin auch nicht sicher über den Kommentar von Emkman. Wenn der Schlüssel "default" in der obigen Struktur nicht an einen einzelnen Endpunkt-ARN gesendet wird, würde ich einen Fehler von AWS erhalten.

Hoffe, dass jemand Nachmittag beschleunigt.

BEARBEITEN

Anschließend wurde die Notwendigkeit, die json_encodes zu verschachteln, beseitigt - es werden doppelte Anführungszeichen gesetzt, die trotz der Angaben der arents, die an der API gefordert werden, für die gesamte Zeichenfolge für GCM und wie oben für das Subarray unter APNS für Apple gelten. Dies ist vielleicht meine Implementierung, aber es ist mit dem AWS PHP SDK ziemlich out-of-the-box und war die einzige Möglichkeit, benutzerdefinierte Daten zu senden.

4
Mike Miller

Leicht zu übersehen, dass Sie APNS_SANDBOX sowie APNS für lokales Testen hinzufügen müssen.

0
Brian F