15

Ich erstelle eine iOS-App und für unsere Push-Benachrichtigungen verwenden wir den Simple Notification Service (SNS) von Amazon.JSON-Nachricht im APNS-Stil in Python für die Verwendung mit Amazon SNS formatieren

SNS ist wunderbar, aber die Dokumentation ist ziemlich spärlich. Ich verwende boto, Amazon Python-Bibliothek, und ich habe herausgefunden, wie Klartext-Push-Benachrichtigungen senden:

device_arn = 'MY ENDPOINT ARN GOES HERE' 
plain_text_message = 'a plaintext message' 
sns.publish(message=plain_text_message,target_arn=device_arn) 

Doch was ist nicht klar, aus der Dokumentation ist wie ein ein Apple Push Notification Service erstellen (APNS) Nachricht. Ich muss einen Ton und ein Abzeichen zusammen mit der Push-Benachrichtigung senden, kann aber nicht herausfinden, wie der JSON für die Nachricht formatiert wird.

Hier ist meine beste Vermutung bisher:

message = {'default':'default message', 'message':{'APNS_SANDBOX':{'aps':{'alert':'inner message','sound':'mySound.caf'}}}} 
messageJSON = json.dumps(message,ensure_ascii=False) 
sns.publish(message=messageJSON,target_arn=device_arn,message_structure='json') 

Wenn ich diesen Code ausführen, aber alles, was ich über die Meldung zu sehen ist „Standardmeldung“ - was bedeutet, dass Amazon SNS meine Botschaft Format abgelehnt und angezeigt die default stattdessen.

Wie formatiere ich dieses JSON korrekt?

Antwort

44

Ich habe es herausgefunden! Stellt sich heraus, dass die APNS-Nutzlast als eine Zeichenfolge innerhalb der größeren Nutzlast codiert werden muss - und es funktioniert vollständig.

Hier ist das letzte, Arbeitscode:

apns_dict = {'aps':{'alert':'inner message','sound':'mySound.caf'}} 
apns_string = json.dumps(apns_dict,ensure_ascii=False) 
message = {'default':'default message','APNS_SANDBOX':apns_string} 
messageJSON = json.dumps(message,ensure_ascii=False) 
sns.publish(message=messageJSON,target_arn=device_arn,message_structure='json') 

Hier ist eine Komplettlösung von dem, was in diesem Code vor sich geht:

Erstellen Sie zunächst das Python-Wörterbuch für APNS:

apns_dict = {'aps':{'alert':'inner message','sound':'mySound.caf'}} 

Zweitens, nehmen Sie dieses Wörterbuch, und drehen Sie es in eine JSON-formatierte Zeichenfolge:

apns_string = json.dumps(apns_dict,ensure_ascii=False) 

Drittens, diese Zeichenfolge in die größere Nutzlast setzen:

message = {'default':'default message','APNS_SANDBOX':apns_string} 

Als nächstes kodieren wir dass in seiner eigenen JSON formatierten String:

messageJSON = json.dumps(message,ensure_ascii=False) 

Die resultierende Zeichenfolge sein kann, dann veröffentlicht mit Boto:

sns.publish(message=messageJSON,target_arn=device_arn,message_structure='json') 
+0

Ich benutze das C# SDK und die fehlende Schlüssel Sache für mich, zusätzlich zu JSON 's der APS-Inhalt war, MessageStructure = "JSON" zu setzen ... sobald ich das tat, war alles gut. THX – kingdango

+0

Ich habe dies an GCM angepasst, mit dem ich Probleme hatte. Lief wie am Schnürchen. Einfügen meines Code als Referenz: –

5

Wenn ich die SNS-Tool veröffentlichen verwende es JSON generiert automatisch die wie folgt aussieht:

{ 
    "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\"} }", 
    "GCM": "{ \"data\": { \"message\": \"<message>\" } }", 
    "ADM": "{ \"data\": { \"message\": \"<message>\" } }" 
} 

Das sieht näher an die Spezifikation über von Apfel sprach in ihrem „Notification Payload“ Abschnitt. Wo geben Sie an, dass die Nachricht

a JSON dictionary object (as defined by RFC 4627). 
This dictionary must contain another dictionary identified by the key aps. 
The aps dictionary contains one or more properties 

haben soll Haben Sie versucht, eine Nachricht näher an dieser Spezifikation bereitzustellen? So etwas wie dies zum Beispiel:

{ 
    'default':'default message', 
    { 
     'aps':{ 
      'alert':'inner message', 
      'sound':'mySound.caf' 
     } 
    } 
} 

Oder nach dem Beispiel aus dem veröffentlichen SNS veröffentlichen Werkzeug:

{ 
    'default':'default message', 
    'APNS': { 
     'aps':{ 
      'alert':'inner message', 
      'sound':'mySound.caf' 
     }\ 
    } 
} 

Vielleicht auch ihre Backslash verwenden.

+0

Die Antwort stellte sich heraus zu sein, dass das APNS-Objekt als ein String codiert werden musste, anstatt ein Sub-JSON-Dictionary innerhalb des größeren Nachrichtenobjekts. Danke für den Beitrag! – bryanjclark

+2

Ah ja, das macht Sinn, da die Zitate im SNS-Beispiel von Amazon entkoppelt sind. – aychedee

+0

yep! Das hat mir den Tipp gegeben - danke! – bryanjclark

Verwandte Themen