15

Sto creando un'app per iOS e per le notifiche push utilizziamo il Simple Notification Service (SNS) di Amazon.Formato messaggio JSON in stile APNS in Python da utilizzare con Amazon SNS

SNS è meraviglioso, ma la documentazione è piuttosto scarsa. Sto utilizzando boto, libreria Python di Amazon, e ho capito come inviare testo normale notifiche push:

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

Tuttavia, ciò che non è chiaro dalla documentazione è come creare un servizio di push di notifica di Apple (APNS) messaggio. Devo inviare un suono e un badge insieme alla notifica push, ma non riesco a capire come formattare il JSON per il messaggio.

Ecco la mia ipotesi migliore finora:

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

Quando ho eseguito questo codice, però, tutto quello che vedo sulla notifica è "messaggio predefinito" - il che significa che Amazon SNS respinto formato del mio messaggio, e visualizzato lo default invece.

Come faccio a formattare questo JSON correttamente?

risposta

44

L'ho capito! Risulta, il payload APNS deve essere codificato come una stringa nel payload grande - e funziona completamente.

Ecco il codice finale di lavoro:

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

Ecco una procedura dettagliata di quello che sta succedendo in questo codice:

In primo luogo, creare il dizionario Python per APNS:

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

In secondo luogo, prendi quel dizionario e trasformalo in una stringa in formato JSON:

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

In terzo luogo, mettere quella stringa nel payload più grande:

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

Successivamente, abbiamo codificare che nella propria stringa di formato JSON:

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

La stringa risultante può quindi essere pubblicato usando boto:

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

Sto usando il C# SDK e la chiave mancante per me, oltre a JSON, il contenuto di APS è stato quello di impostare MessageStructure = "json" ... una volta che ho fatto tutto ciò andava bene. THX – kingdango

+0

Ho adattato questo a GCM, che stavo avendo problemi con. Ha funzionato come un fascino. Incollare il mio codice per riferimento: –

5

Quando uso la SNS strumento di pubblicarla genera automaticamente JSON che assomiglia a questo:

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

Questo sembra più vicino alla spec parlato da Apple nella loro sezione "Notification Payload". Dove dichiarano che il messaggio dovrebbe essere

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 

Hai provato a fornire un messaggio più vicino a tale specifica? Qualcosa di simile, per esempio:

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

O seguendo l'esempio dallo strumento pubblicare SNS pubblicare:

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

Forse anche usando il loro backslash fuga.

+0

La risposta è risultata per essere che l'oggetto APNS doveva essere codificato come una stringa, piuttosto che un dizionario sub-JSON all'interno dell'oggetto messaggio più grande. Grazie per l'articolo, però! – bryanjclark

+2

Ah sì, ha senso visto che le virgolette sono sfuggite nell'esempio SNS di Amazon. – aychedee

+0

sì! Questo è quello che mi ha dato la mancia - grazie! – bryanjclark