带有自定义iOS负载的Amazon Simple Notification Service就没那么简单了

本文关键字:Service Notification 没那么简单 Simple Amazon 自定义 iOS 负载 | 更新日期: 2023-09-27 18:16:13

发送纯文本通知很容易,并且有充分的文档记录。但是我今天一直在为iOS发送一个自定义通知,它有警报和一些字段,如userId。

我从这个帮助页面开始,并实现了类似于上一个示例的东西,然后我发现这个答案似乎使帮助页面上的最后一个示例无效,如"url";属性应该在";ap"之外。对象。我尝试了很多组合,但每一个都是作为文本发送到应用程序(整条消息,带有"默认";属性和"APNS"对象)…

如果我显式地将MessageStructure设置为json,我会得到错误:"无效参数:消息结构- json消息体未能解析"但我很确定我的JSON是好的,当发送到SNS消息属性中的字符串看起来像这样:

{ "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'"
            }" 
}

有没有人有一个很好的例子发送通知与自定义有效载荷通过SNS在c# ?因为亚马逊肯定没有…

带有自定义iOS负载的Amazon Simple Notification Service就没那么简单了

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

{"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; }
}

我通过以下方式获得Amazon SNS消息:

new AmazonSNSMessage(...).SerializeToJSON();

刚刚为我解决这个问题的关键是意识到特定于SNS的外部JSON(例如"默认"answers"APNS"属性)绝对不能被转义,只有内部有效载荷。例如,这个Message值成功了(只是发布了开始):

{"APNS":"{'"aps'" ... 

注意第一个属性"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中有很多东西浪费了大量的时间,同样重要的是:一个人的幸福感。尽管如此,我还是很感激你的服务。