2015-10-06 58 views
4

發送純文本通知很容易且有詳細記錄。但我今天一直在拉我的頭髮,發送一個具有警報和一些像userId這樣的字段的iOS自定義通知。亞馬遜簡單通知服務與自定義iOS有效負載並非如此簡單

我開始於this help page並實現了類似於最後一個示例的內容,然後我發現this answer似乎使幫助頁上的最後一個示例失效,因爲「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\" 
      }" 
} 

有沒有人有一個很好的例子通過在C#中的SNS發送通知與自定義有效載荷?因爲亞馬遜肯定沒有......謝謝!

回答

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\"}"} 

這些都是我序列化(僅用於APNS的時刻)的班,隨便用

[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消息:你需要的不是事件和對象ID屬性

new AmazonSNSMessage(...).SerializeToJSON(); 
+0

感謝您的回答,節省了我的時間。 :) – Desmond

+0

很好的答案,正在尋找一個適合這個年齡的解決方案! –

+0

同樣的解決方案來格式化json for android GCM – dpineda

1

,只是修正了這個對我來說,關鍵是認識到外JSON規範與SNS(例如「默認」和「APNS」屬性)不能被轉義,只有內部有效載荷。舉例來說,此消息值成功(剛剛發佈開始):

{"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應該不是必須轉義,但內層必須

肥皂盒:那個文檔怎麼樣?這個API中的很多東西浪費了大部分時間,同樣重要:人的幸福感。儘管如此,我很欣賞這項服務。

相關問題