具有自定义iOS有效负载的Amazon Simple Notification Service不那么简单

vic*_*tan 4 c# notifications amazon payload ios

发送纯文本通知很容易并且有详细记录.但是我今天一直在拉我的头发,关于发送带有警报的iOS自定义通知和一些像userId这样的字段.

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

如果我明确地将MessageStructure设置为json我得到错误:"无效参数:消息结构 - 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\"
            }" 
}
Run Code Online (Sandbox Code Playgroud)

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

vic*_*tan 8

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

{"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\"}"}
Run Code Online (Sandbox Code Playgroud)

这些是我正在序列化的类(目前只针对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; }
}
Run Code Online (Sandbox Code Playgroud)

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

new AmazonSNSMessage(...).SerializeToJSON();
Run Code Online (Sandbox Code Playgroud)