C# Xamarin iOS无法从PushNotification负载获取特定变量
通过发送以下APNS有效负载:C# Xamarin iOS无法从PushNotification负载获取特定变量,c#,xamarin,push-notification,xamarin.ios,nsdictionary,C#,Xamarin,Push Notification,Xamarin.ios,Nsdictionary,通过发送以下APNS有效负载: {"aps":{"alert":"test Push","badge":1,"sound":"default"}, "objid":"SomeID","vid":"4229", "title":"aTitle","type":"queryform", "idArray":["-100", "SomeID"]}` 以下方法将NSDictionary转换为类(notificationInfo是“receivedNotification”中的userInfo)。 以
{"aps":{"alert":"test Push","badge":1,"sound":"default"},
"objid":"SomeID","vid":"4229", "title":"aTitle","type":"queryform",
"idArray":["-100", "SomeID"]}`
以下方法将NSDictionary转换为类(notificationInfo是“receivedNotification”中的userInfo)。
以下问题:如果ObjectForKey:“idArray”用于获取“idArray”的值等于有效负载中的键,则变量objid
为空。但是通知信息中存在objid
。如果我将“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;
}
objid
将被设置。如果有效负载中的数组被调用:idArray
,objid=null
这真的很奇怪。我希望有人能帮上忙。因此,尽管我不完全理解您的问题,正如您自己所说,您可以通过直接拉出“objid”来解决问题,但您的负载和代码中有一些东西需要修改,以遵循最佳实践 我认为有效载荷应该如下所示:(在objid之后,以及在idArray末尾,您遗漏了一些定义括号) 此外,您的代码未正确使用null传播,这将导致将来出现问题。如果您检查null,还必须传播计数,否则可能会引发异常
if (idArray != null && idArray?.Count > 0)
{
}
还值得注意的是,JSON通常以小写形式反序列化属性名称。不过,反序列化程序之间可能有所不同。谢谢,但要点如下:如果我在有效负载中写入“idArray”,则不会设置objid,如果我写入“idArray”(或删除“idArray”),则会设置objid。
{"aps":{"alert":"test Push","badge":1,"sound":"default"},
"objid":{"SomeID","vid":"4229", "title":"aTitle","type":"queryform",
"idArray":["-100", "SomeID"]}}
if (idArray != null && idArray?.Count > 0)
{
}