Форматирование сообщения JSON в стиле APNS на Python для использования с Amazon SNS

Я создаю приложение iOS, и для наших push-уведомлений мы используем простой сервис уведомлений Amazon (SNS).

SNS замечательно, но документация довольно скудная. Я использую бото, библиотека Python Amazon, и я понял, как отправлять текстовые push-уведомления:

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

однако из документации неясно, как создать сообщение Службы Push-уведомлений Apple (APNS). Мне нужно послать звук и ... значок вместе с push-уведомлением, но не может понять, как отформатировать JSON для сообщения.

вот я думаю до сих пор:

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

когда я запускаю этот код, все, что я вижу в уведомлении, - это "сообщение по умолчанию", что означает, что Amazon SNS отклонил формат моего сообщения и отобразил default вместо.

Как правильно отформатировать этот JSON?

2 ответов


Я все понял! Оказывается, полезная нагрузка APNS должна быть закодирована как строка внутри большей полезной нагрузки - и это полностью работает.

вот окончательный, рабочий код:

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

вот пошаговое руководство о том, что происходит в этом коде:

сначала создайте словарь python для APNS:

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

во-вторых, возьмите этот словарь и превратите его в строку в формате JSON:

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

в-третьих, поставить эта строка в большую полезную нагрузку:

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

Далее, мы кодируем это в собственной строке в формате JSON:

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

полученная строка может быть опубликована с помощью boto:

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

когда я использую СНС опубликовать инструмент автоматически создает JSON, который выглядит так:

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

это выглядит ближе к спецификации, о которой говорила apple в своих"Полезная Нагрузка Уведомления". Где они заявляют, что сообщение должно быть

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

вы пробовали предоставить сообщение ближе к этой спецификации? Что-то вроде этого, например:

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

или по примеру публикации SNS publish инструмент:

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

возможно, также, используя их обратную косую черту побега.