2017-06-16 11 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