Wie kann ich zusätzliche Parameter in der Nutzlast per Amazon SNS-Push-Benachrichtigung senden?
Lesezeit: 7 Minuten
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.
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:
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.
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.
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
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.
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.
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.
14449200cookie-checkWie kann ich zusätzliche Parameter in der Nutzlast per Amazon SNS-Push-Benachrichtigung senden?yes
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