Wie kann ich zusätzliche Parameter in der Nutzlast per Amazon SNS-Push-Benachrichtigung senden?

Lesezeit: 7 Minuten

Benutzeravatar von mAc
Mac

Dies ist etwas Neues, das ich frage, da ich auf SO keine Antworten darauf habe.

Ich verwende Amazon SNS Push, um Push an meine registrierten Geräte zu senden, alles funktioniert gut, ich kann Geräte beim ersten Start in meiner App registrieren, Push senden usw. usw. Das Problem, mit dem ich konfrontiert bin, ist, dass ich eine bestimmte Seite öffnen möchte Wenn ich meine App per 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, dh “Nachricht”, in dem wir die Nutzlast so weit ich weiß übergeben können.

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

  • Nun, ich habe die Lösung, Amazon hätte sie in ihrer Implementierungsdokumentation erwähnen sollen, bald werde ich die Antwort hochladen.

    – Mac

    20. September 2013 um 5:12 Uhr

  • Hallo, bitte teilen Sie die Lösung, ich stecke bei demselben Problem fest 🙂

    – felixdv

    24. September 2013 um 2:26 Uhr

  • hast du schon mal herausgefunden woran es lag? Ich habe dasselbe – alles, was ich senden kann, ist die Standardnachricht. Ich bin auf einer anderen Plattform, habe aber das gleiche Problem – stackoverflow.com/q/22366310/850969

    – MikeT

    13. März 2014 um 18:32 Uhr

  • Die Lösung ist unten angegeben, haben Sie noch andere Probleme?

    – Mac

    18. März 2014 um 12:24 Uhr

  • Hey wo kann ich “aws-sdk.phar” herunterladen

    – Codesen

    5. Mai 2014 um 8:15 Uhr

Hier fehlt noch die Amazon SNS-Dokumentation mit wenigen Hinweisen zum Formatieren einer Nachricht zur Verwendung einer benutzerdefinierten Nutzlast. Diese häufig gestellten Fragen erklärt, wie es geht, gibt aber kein Beispiel.

Die Lösung besteht darin, die Benachrichtigung mit dem zu veröffentlichen MessageStructure Parametersatz auf json und ein Message -Parameter, der json-codiert ist, mit einem Schlüssel für jedes Transportprotokoll. Es muss immer ein default Schlüssel auch als Fallback.

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

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 (aber Sie können Schlüssel weglassen, 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>\" } }" 
}

  • Beim direkten Veröffentlichen auf einem mobilen Endpunkt muss kein Standardschlüssel vorhanden sein. Es muss entweder a default Schlüssel oder ein Wertschlüssel GCM, APNSoder APNS_SANDBOX. Wenn Sie den Standardschlüssel weglassen, sparen Sie Bytes, da alle Schlüssel und Werte auf die 256-KB-Grenze angerechnet werden.

    – Emkmann

    10. Juli 2014 um 1:26 Uhr


  • Hier ist der Link zur Dokumentation docs.aws.amazon.com/sns/latest/dg/… Ich habe eine ganze Weile gebraucht, um es zu finden …

    – esamatti

    8. Februar 2016 um 13:29 Uhr

  • Ist es möglich, den Ton für GCM einzustellen?

    – Hinausreichen

    25. März 2016 um 7:11 Uhr

  • Hey @felixdv… könntest du dir das bitte ansehen unter stackoverflow.com/questions/43079796/… Sehr geschätzt!

    – i_raqz

    29. März 2017 um 10:18 Uhr

Benutzeravatar von rjobidon
rjobidon

Von einer Lambda-Funktion (Node.js) sollte der Aufruf wie folgt lauten:

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 vereinfachen, indem Sie nur ein Protokoll angeben: APNS oder APNS_SANDBOX.

  • Dies funktioniert größtenteils, außer Sie haben das solide Schlüssel-Wert-Paar verlegt. Es sollte zusammen mit dem Alert-Schlüssel-Wert-Paar im aps-Objekt platziert werden.

    – Benutzer3344977

    14. Oktober 2016 um 4:39 Uhr

  • @ user3344977 Danke, ich habe meine Antwort korrigiert. Offizielle APNS-Dokumentation: developer.apple.com/library/content/documentation/…

    – Jobidon

    16. Oktober 2016 um 3:03 Uhr


  • Hallo Leute, ich habe ein Problem, bei dem keine meiner benutzerdefinierten Daten auf der Geräteseite empfangen werden und auch der Wert für den Schlüssel „Sound“ nicht definiert ist. Irgendwelche Gedanken? @rjobidon

    – Vince

    31. Mai 2017 um 0:12 Uhr

  • Hallo, @Vince. Ich verstehe nicht warum, weil die Amazon-Dokumentation besagt, dass Sie benutzerdefinierte Schlüssel-Wert-Paare entweder im plattformspezifischen Abschnitt und innerhalb der JSON-Nutzlast senden können. docs.aws.amazon.com/sns/latest/dg/… Bitte überprüfen Sie Ihre Payload direkt im Rückruf der Anwendung (_:didReceiveRemoteNotification:).

    – Jobidon

    5. Juni 2017 um 2:28 Uhr

  • @rjobidon Meine Lösung bestand darin, sicherzustellen, dass ich die richtige Nutzlast habe. Ich habe eine PN an eine per Testflug verteilte App gesendet, aber mein Server strukturierte die Nachrichtennutzlast immer noch als „APNS_SANDBOX“ und nicht als „APNS“. Rat an andere: Stellen Sie sicher, dass Ihre Payload auf die richtige Umgebung abzielt.

    – Vince

    5. Juni 2017 um 5:30 Uhr

Benutzeravatar von Mike Miller
Mike Müller

Ich bin zu unerfahren, um hier einen Kommentar abzugeben, aber ich möchte die Aufmerksamkeit der Leute auf den verschachtelten json_encode lenken. Dies ist wichtig, ohne dass die APNS-Zeichenfolge von Amazon nicht analysiert wird und nur der Standardnachrichtenwert gesendet wird.

Ich habe folgendes gemacht:

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

Aber das wird nicht funktionieren. Sie MÜSSEN das Array unter „APNS“ separat json_encodieren, wie in der Antwort von felixdv gezeigt. Fragen Sie mich nicht warum, da die Ausgaben in meinem Konsolenprotokoll genau gleich aussehen. Obwohl die Dokumente zeigen, dass die JSON-Zeichenfolge unter dem Schlüssel ‚APNS‘ in „“ eingeschlossen werden sollte, vermuten Sie, dass dies etwas damit zu tun hat.

http://docs.aws.amazon.com/sns/latest/dg/mobile-push-send-custommessage.html

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

Ich bin mir auch nicht sicher über Emkmans Kommentar. Ohne den „Standard“-Schlüssel in der obigen Struktur, der an einen einzelnen Endpunkt-ARN gesendet wird, würde ich eine Fehlermeldung von AWS erhalten.

Hoffe, das beschleunigt den Nachmittag.

BEARBEITEN

Anschließend wurde die Notwendigkeit beseitigt, die json_encodes zu verschachteln – es werden doppelte Anführungszeichen mit Escapezeichen erstellt, die trotz der Dokumentation, die besagt, dass sie in der API nicht erforderlich sind, für die gesamte Zeichenfolge für GCM und wie oben für das Unterarray unter APNS für Apple gelten. Dies ist vielleicht meine Implementierung, aber sie ist mit dem AWS PHP SDK ziemlich sofort einsatzbereit und war die einzige Möglichkeit, benutzerdefinierte Daten zu senden.

Leicht zu übersehen, dass Sie APNS_SANDBOX sowie APNS zum lokalen Testen hinzufügen müssen.

1444920cookie-checkWie kann ich zusätzliche Parameter in der Nutzlast per Amazon SNS-Push-Benachrichtigung senden?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy