2017-06-16 29 views
0

通過發送以下APNS有效負載:Xamarin的iOS不能從PushNotification有效載荷獲取特定的變量

{"aps":{"alert":"test Push","badge":1,"sound":"default"}, 
"objid":"SomeID","vid":"4229", "title":"aTitle","type":"queryform", 
"idArray":["-100", "SomeID"]}` 

以下方法可轉換NSDictionary的一類(notificationInfo是「receivedNotification」的用戶信息 繼問題:如果獲得「idArray」的ObjectForKey:「idArray」等於有效載荷中的密鑰,則變量objid爲空,但objid存在於notificationInfo中,如果我將「idArray」重命名爲Idarray,則會設置objid

ApnsNotificationInfo GetApnsNotificationInfo(NSDictionary notificationInfo) 
    { 

     var apnsInfo = new ApnsNotificationInfo(); 

     if (notificationInfo == null || notificationInfo.Count == 0) 
      return apnsInfo; 

     var idArray = notificationInfo.ObjectForKey(new NSString("idArray")) as NSArray; 

     if (idArray != null && idArray.Count > 0) 
     { 
      var articleId = (idArray.Count == 2) ? 
       idArray.GetItem<NSNumber>(1) : 
       idArray.GetItem<NSNumber>(0); 

      if (articleId == null) 
       return apnsInfo; 

      apnsInfo.ArticleId = articleId.Int32Value; 

      if (idArray.Count == 2) 
      { 
       var categoryId = idArray.GetItem<NSNumber>(0); 

       if (categoryId != null) 
        apnsInfo.CategoryId = categoryId.Int32Value; 
      } 

     } 

     NSString message = null; 

     var aps = notificationInfo.ObjectForKey(new NSString("aps")) as NSDictionary; 

     if (aps != null) 
      message = aps.ObjectForKey(new NSString("alert")) as NSString; 

     if (message != null) 
      apnsInfo.Message = message.ToString(); 

     var title = notificationInfo.ObjectForKey (new NSString ("title")) as NSString; 
     var type = notificationInfo.ObjectForKey (new NSString ("type")) as NSString; 
     var objid = notificationInfo.ObjectForKey (new NSString ("objid")) as NSString; 
     var vid = notificationInfo.ValueForKey (new NSString ("vid")) as NSString; 

     if(!string.IsNullOrEmpty (title)){ 
      apnsInfo.Title = title; 
     } 

     if (!string.IsNullOrEmpty (type)) { 

      apnsInfo.Type = type; 

      if(objid != null){ 

       apnsInfo.requestID = objid.ToString(); 
      } 
      if(vid != null){ 
       apnsInfo.vid = Convert.ToInt32 (vid); 
      } 
     } 
     return apnsInfo; 
    } 

我的問題的另一種解釋:如果我發送該有效載荷: {"aps":{"alert":"test Push","badge":1,"sound":"default"}, "objid":"SomeID","vid":"4229", "title":"aTitle","type":"queryform", "Idarray":["-100", "SomeID"]}

var objid = notificationInfo.ObjectForKey (new NSString ("objid")) as NSString; 

objid將被設置。如果有效載荷中的陣列被調用:idArrayobjid = null

這真的很奇怪。我希望有人能幫幫忙。

回答

0

所以,雖然我並不完全明白你的問題,因爲你自己說的,你可以拉出「OBJID」直接,有需要在有效載荷進行修正一些東西,你的代碼要堅持解決問題到最佳實踐。

有效載荷我認爲應該如下:(您錯過了一些定義括號的objid後,並在idArray結束)。

{"aps":{"alert":"test Push","badge":1,"sound":"default"}, 
"objid":{"SomeID","vid":"4229", "title":"aTitle","type":"queryform", 
"idArray":["-100", "SomeID"]}} 

此外,您的代碼沒有正確使用空傳播,並且將來會導致您的問題。如果您檢查爲null,則還必須傳播計數,否則可能會導致拋出異常。

if (idArray != null && idArray?.Count > 0) 
{ 
} 

還值得注意的是,經常JSON反序列化小寫屬性名稱。然而,反竊聽者可能會有所不同。

+0

謝謝,但問題是:若我在有效載荷寫「idArray」的objid不會設置,如果我寫「idarray」(或刪除「idArray」)的objid將被設置。 – Klinki