sns aws python json amazon-web-services apple-push-notifications amazon-sns

aws - Formato de mensaje JSON de estilo APNS en Python para usar con Amazon SNS



python s3 aws (2)

Estoy creando una aplicación para iOS y, para nuestras notificaciones push, estamos usando el Servicio de notificación simple (SNS) de Amazon.

SNS es maravilloso, pero la documentación es bastante escasa. Estoy usando boto , la biblioteca Python de Amazon, y he descubierto cómo enviar notificaciones push de texto sin formato:

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

Sin embargo, lo que no queda claro en la documentación es cómo crear un mensaje del Servicio de notificaciones push de Apple (APNS). Necesito enviar un sonido y un distintivo junto con la notificación de inserción, pero no puedo averiguar cómo formatear el JSON para el mensaje.

Aquí está mi mejor conjetura hasta ahora:

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

Sin embargo, cuando ejecuto este código, todo lo que veo en la notificación es "mensaje predeterminado", lo que significa que Amazon SNS rechazó el formato de mi mensaje y, en su lugar, mostró el default .

¿Cómo formateo este JSON correctamente?


¡Me lo imaginé! Resulta que, la carga útil APNS tiene que codificarse como una cadena dentro de la carga útil más grande , y funciona totalmente.

Aquí está el código de trabajo final:

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

Aquí hay un tutorial de lo que está pasando en este código:

Primero, crea el diccionario de python para APNS:

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

En segundo lugar, tome ese diccionario y conviértalo en una cadena con formato JSON:

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

En tercer lugar, ponga esa cadena en la carga útil más grande:

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

A continuación, codificamos eso en su propia cadena con formato JSON:

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

La cadena resultante puede ser publicada usando boto:

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


Cuando uso la herramienta de publicación SNS, se genera automáticamente JSON que tiene este aspecto:

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

Esto se parece más a la especificación mencionada por Apple en su sección " Carga de notificación ". Donde afirman que el mensaje debe ser

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

¿Ha intentado proporcionar un mensaje más cercano a esa especificación? Algo como esto, por ejemplo:

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

O siguiendo el ejemplo de la herramienta de publicación de publicación SNS:

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

Tal vez también utilizando su barra invertida de escape.