Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中格式化APNS样式的JSON消息,以便与Amazon SNS一起使用_Python_Json_Amazon Web Services_Apple Push Notifications_Amazon Sns - Fatal编程技术网

在Python中格式化APNS样式的JSON消息,以便与Amazon SNS一起使用

在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) 然而,文档中不

我正在创建一个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)
然而,文档中不清楚的是如何创建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,这让我遇到了麻烦。工作得很有魅力。粘贴我的代码以供参考: