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

具有自定义iOS负载的Amazon简单通知服务:不那么简单

刘泰
2023-03-14

发送纯文本通知很容易,并且有据可查。但是我今天一直在为给iOS发送一个自定义通知而烦恼,这个通知有警告和一些像userId这样的字段。

我从这个帮助页面开始,实现了与上一个示例类似的东西,然后我发现这个答案似乎使帮助页面上的上一个示例无效,因为“url”属性应该在“aps”对象之外。我尝试了很多组合,但每一个都以文本形式发送到应用程序(整个消息,带有“默认”属性和“APNS”对象)...

如果我显式地将MessageStructure设置为json,我会得到错误:“无效参数:Message Structure-json消息体解析失败”,但我非常确定我的json是好的,当发送到SNS时,Message属性中的字符串如下所示:

{ "default":"You received a new message from X.", 
 "APNS_SANDBOX":"{ \"aps\": {\"alert\":\"You received a new message from X.\"}, 
                \"event\":\"Message\", 
                \"objectID\":\"7a39d9f4-2c3f-43d5-97e0-914c4a117cee\"
            }", 
 "APNS":"{ \"aps\": {\"alert\":\"You received a new message from X.\"}, 
                \"event\":\"Message\", 
                \"objectID\":\"7a39d9f4-2c3f-43d5-97e0-914c4a117cee\"
            }" 
}

有没有人有一个很好的例子,通过C#中的SNS发送带有自定义负载的通知?因为亚马逊肯定没有…谢谢!

共有2个答案

宇文修筠
2023-03-14

对我来说,解决这个问题的关键是意识到特定于SNS的外部JSON(例如“默认”和“APNS”属性)不能被转义,只能是内部有效负载。例如,此消息值成功(刚发布开始):

{"APNS":"{\"aps\" ... 

注意,第一个属性<code>“APNS”

JObject payload = ... // your apns, etc payload JObject

var snsMsgJson = new JObject(
    new JProperty("default", "message 1 2 3"), // "default" is optional if APNS provided
    new JProperty("APNS", payload.ToString(Formatting.None))
);

string str = snsMsgJson.ToString(Formatting.None);

我在上面的例子中发现了这一点,谢谢!但是,我知道上面的“干净类”所谓的解决方案实际上不能也不应该是一个要求。所以当他说:“唯一的区别是行间距……在干净版本中,除了属性值之外没有空格”是不正确的。真正的区别是,正如我所说,外部(SNS特定)JSON不得转义,但内部必须转义。

Soap box:文档怎么样?这个API中有太多的东西浪费了大量的时间,同样重要的是:一个人的幸福感。不管怎样,我还是很感激你们的服务。

裴俊迈
2023-03-14

奇怪的是,当我通过使用类和序列化对象而不是仅仅发送一个格式化的字符串来实现这种简洁的方式时,它工作了。唯一的区别是间距...在干净版本中,除了属性值中没有空格:

{"default":"You received a new message from X.","APNS_SANDBOX":"{\"aps\":{\"alert\":\"You received a new message from X.\"},\"event\":\"Message\",\"objectID\":\"7a39d9f4-2c3f-43d5-97e0-914c4a117cee\"}","APNS":"{\"aps\":{\"alert\":\"You received a new message from X.\"},\"event\":\"Message\",\"objectID\":\"7a39d9f4-2c3f-43d5-97e0-914c4a117cee\"}"}

这些是我正在序列化的类(目前只针对APNS),使用您需要的任何属性,而不是Event和ObjectID:

[DataContract]
public class AmazonSNSMessage
{
    [DataMember(Name = "default")]
    public string Default { get; set; }

    [DataMember(Name = "APNS_SANDBOX")]
    public string APNSSandbox { get; set; }

    [DataMember(Name = "APNS")]
    public string APNSLive { get; set; }

    public AmazonSNSMessage(string notificationText, NotificationEvent notificationEvent, string objectID)
    {
        Default = notificationText;
        var apnsSerialized = JsonConvert.SerializeObject(new APNS
        {
            APS = new APS { Alert = notificationText },
            Event = Enum.GetName(typeof(NotificationEvent), notificationEvent),
            ObjectID = objectID
        });
        APNSLive = APNSSandbox = apnsSerialized;
    }

    public string SerializeToJSON()
    {
        return JsonConvert.SerializeObject(this);
    }
}

[DataContract]
public class APNS 
{
    [DataMember(Name = "aps")]
    public APS APS { get; set; }

    [DataMember(Name = "event")]
    public string Event { get; set; }

    [DataMember(Name = "objectID")]
    public string ObjectID { get; set; }
}

[DataContract]
public class APS
{
    [DataMember(Name = "alert")]
    public string Alert { get; set; }
}

因此,我通过以下方式获得亚马逊 SNS 消息:

new AmazonSNSMessage(...).SerializeToJSON();
 类似资料:
  • 问题内容: 我目前正在创建一个返回静态页面的小型HTTP服务器…我尝试使用Java套接字: 该代码不包含任何错误,我从浏览器得到了如下响应: 但是我的问题是浏览器没有页面?有什么帮助吗? PS:我已经读过这篇文章:http : //en.wikipedia.org/wiki/Hypertext_Transfer_Protocol,(对不起法语,…) 问题答案: 除了每个请求标头行之后,您还必须在标

  • 我正在尝试编写一个简单的数据库函数来从表中检索值。 MariaDB只是给出以下消息 在“开始声明标题VARCHAR DEFAULT”附近,在第2行的标题FR中选择MyTitle 我看不出有什么不对。请帮忙。 谢谢你

  • 我正在开发一个将通知推送到移动设备的系统,我正在构建一个asp.net web api应用程序作为服务器,将移动设备注册到aws sns,作为平台应用程序的endpoint,并使用Firebase massaging服务的令牌,我已经使用aws sns控制台成功地将消息发布到移动设备,但我找不到任何文档可以指导我使用asp.net server实现它。我已经从aws控制台文档中注册并创建了endp

  • 我有一个非常简单的nodejs服务器,但由于某种原因,使用“cors”包似乎无法识别请求的来源。 下面是我的nodejs服务器配置: 这是我的服务器启动文件: 我在本地主机上运行这个服务器,但是cors回调中的原点总是“未定义”。例如,当我在浏览器上打开http://localhost:5000或进行curl调用时。 如何使用cors使其不阻塞本地主机上的请求?

  • 问题内容: 有谁知道将Java方法发布为Web服务的非常简单的方法?我真的不想要使用Tomcat或Jetty或任何其他容器框架的开销。 方案:我想从本地LAN上的其他计算机访问服务类型应用程序中的一组Java方法。 问题答案: 好吧,Tomcat或Jetty对于将某些方法发布为Web服务可能是过大的。但是另一方面,它并不太复杂,他们可以完成工作,那么为什么不呢? 不久前我遇到了类似的问题,并将To

  • 在我的应用程序中,我有一个通知要显示。 比方说,当显示通知时,我想按“是”进入活动并隐藏通知,按“否”什么都不做只是隐藏通知。 我尝试了这段代码,但是onclick不是onclckpendingent,我不能做任何我想做的事情。 我怎么能这样做?