19

我正在创建一个 iOS 应用程序,对于我们的推送通知,我们正在使用亚马逊的简单通知服务 (SNS)。

SNS 很棒,但文档很少。我正在使用boto,亚马逊的 Python 库,并且我已经弄清楚如何发送纯文本推送通知:

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

但是,文档中并不清楚如何创建 Apple 推送通知服务 (APNS) 消息。我需要连同推送通知一起发送声音和徽章,但不知道如何格式化消息的 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?

4

2 回答 2

51

我想到了! 事实证明,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')

这是此代码中发生的事情的演练:

首先,为 APNS 创建 python 字典:

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')
于 2013-11-21T23:34:21.483 回答
6

当我使用 SNS 发布工具时,它会自动生成如下所示的 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>\" } }" 
 }

这看起来更接近苹果在“通知有效负载”部分中谈到的规范。他们声明消息应该在哪里

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 发布工具的示例:

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

也许还使用他们的反斜杠转义。

于 2013-11-21T22:51:50.563 回答