在Python中格式化APNS样式的JSON消息,以便与Amazon SNS一起使用
我正在创建一个iOS应用程序,对于推送通知,我们使用亚马逊的简单通知服务(SNS) SNS很棒,但是文档非常稀少。我正在使用Amazon的Python库,我已经了解了如何发送纯文本推送通知:在Python中格式化APNS样式的JSON消息,以便与Amazon SNS一起使用,python,json,amazon-web-services,apple-push-notifications,amazon-sns,Python,Json,Amazon Web Services,Apple Push Notifications,Amazon Sns,我正在创建一个iOS应用程序,对于推送通知,我们使用亚马逊的简单通知服务(SNS) SNS很棒,但是文档非常稀少。我正在使用Amazon的Python库,我已经了解了如何发送纯文本推送通知: device_arn = 'MY ENDPOINT ARN GOES HERE' plain_text_message = 'a plaintext message' sns.publish(message=plain_text_message,target_arn=device_arn) 然而,文档中不
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拒绝了我的消息格式,而是显示了默认值
如何正确格式化此JSON?当我使用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>\" } }"
}
您是否尝试过提供更接近该规范的消息?比如说:
{
'default':'default message',
{
'aps':{
'alert':'inner message',
'sound':'mySound.caf'
}
}
}
或者按照发布SNS发布工具中的示例:
{
'default':'default message',
'APNS': {
'aps':{
'alert':'inner message',
'sound':'mySound.caf'
}\
}
}
也许还使用了反斜杠转义。我猜出来了!
事实证明,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')
以下是此代码中发生的情况的演练:
首先,为APN创建python字典:
apns_dict = {'aps':{'alert':'inner message','sound':'mySound.caf'}}
其次,将该字典转换为JSON格式的字符串:
apns_string = json.dumps(apns_dict,ensure_ascii=False)
messageJSON = json.dumps(message,ensure_ascii=False)
第三,将该字符串放入更大的有效负载:
message = {'default':'default message','APNS_SANDBOX':apns_string}
接下来,我们将其编码为自己的JSON格式字符串:
apns_string = json.dumps(apns_dict,ensure_ascii=False)
messageJSON = json.dumps(message,ensure_ascii=False)
然后可以使用boto发布生成的字符串:
sns.publish(message=messageJSON,target_arn=device_arn,message_structure='json')
答案是APNS对象需要编码为字符串,而不是在更大的消息对象内的子JSON字典。不过,谢谢你的评论!啊,是的,这是有道理的,因为在亚马逊的SNS示例中,引号被转义了。我使用的是C#SDK,对我来说,关键缺少的东西是,除了JSON之外,APS的内容是设置MessageStructure=“JSON”。。。一旦我做到了,一切都很好。THXI将其应用于GCM,这让我遇到了麻烦。工作得很有魅力。粘贴我的代码以供参考: