2017-06-16 7 views
0

から特定の変数を取得カント:XamarinのiOSは、以下のAPNS-ペイロードを送信することによりPushNotificationペイロード

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

次のメソッドがクラスにNSDictionaryのを変換する(notificationInfoは「receivedNotification」からのUserInfoある 後。問題: "idArray"を得るためのObjectForKey: "idArray"がペイロードのキーと等しい場合、変数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をチェックしている場合は、Countを宣言する必要があります。それ以外の場合は、例外がスローされる可能性があります。

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

JSONはプロパティ名を小文字に変換することもよくあります。しかし、これはデシリアライザによって異なる場合があります。

+0

ありがとうございますが、ポイントは次のとおりです:ペイロード "idArray" objidに書き込むと、 "idarray"(または "idArray"を削除する)を書くとobjidが設定されます。 – Klinki

関連する問題