当前位置: 首页 > 知识库问答 >
问题:

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

籍光熙
2023-03-14

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

SNS很棒,但文档非常稀少。我正在使用亚马逊的Python库boto,我已经知道了如何发送纯文本推送通知:

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

不过,当我运行这段代码时,我在通知上看到的只是“默认消息”——这意味着亚马逊SNS拒绝了我的消息格式,而是显示了默认消息。

如何正确格式化此JSON?

共有2个答案

法风畔
2023-03-14

当我使用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'
         }\
     }
 }

也可以使用反斜杠转义。

顾宏朗
2023-03-14

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

第三,将该字符串放入较大的有效负载中:

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')
 类似资料:
  • 问题内容: 我已经在资源束中存储了一些消息。我正在尝试按以下格式设置这些消息。 假设第一个参数(即实际消息)存储在以某种方式检索到的属性文件中。 第二个参数(即5)是一个动态值,应放置在不会发生的占位符中。下一行打印, 您即将删除{0}行。 占位符不会替换为实际参数。 这里是撇号- 。我试图像往常一样逃避它,尽管它没有用。需要进行哪些更改才能使其正常工作? 问题答案: 向模式添加多余的撇号以确保显

  • 问题内容: 我在Python2.6.5中构造了一个字符串,该字符串将具有不同数量的标记,这些标记与list中的条目数匹配。我需要写出格式化的字符串。以下内容不起作用,但表示我要执行的操作。在此示例中,有三个标记,并且列表具有三个条目。 我希望输出字符串为: 问题答案: print s % tuple(x) 代替

  • 例子: ` { } ` 看图 这也没超出什么位数吧 看了下long的最大是19位 这个是18位 再者说 这json解析没有位数限制吧 不懂 long的长度

  • 我使用kafka流来消耗来自一个主题的JSON字符串,处理并生成存储在另一个主题中的响应。然而,需要对响应主题产生的消息需要采用avro格式。 我已经尝试使用键作为字符串序列和值作为规范AvroSerde 以下是我创建拓扑的代码: 以下是我的配置 当我尝试使用该示例时,我看到了以下错误:

  • 消息通常按照批量的方式写入.record batch 是批量消息的技术术语,它包含一条或多条 records.不良情况下, record batch 只包含一条 record.Record batches 和 records 都有他们自己的 headers.在 kafka 0.11.0及后续版本中(消息格式的版本为 v2 或者 magic=2)解释了每种消息格式.点击查看消息格式详情. 5.3.1

  • 我有一个swft/iOS9应用程序使用GCM的通知(WIP)。 申请授权可以。证书没问题。配置文件正常。一切都是在苹果的开发门户网站上配置的。 收到通知时调用此函数。 问题 当服务器发送以下格式时,我只能在前面描述的函数中检测到通知,并且它“有效”,因为我有一个断点来检测它,否则什么也不会发生。 负责Web服务的人为我做了这个,它复制了现有的Android(注册ID有用吗?)。 由于行为不是预期的