Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Xamarin iOS无法从PushNotification负载获取特定变量_C#_Xamarin_Push Notification_Xamarin.ios_Nsdictionary - Fatal编程技术网

C# Xamarin iOS无法从PushNotification负载获取特定变量

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)。 以

通过发送以下APNS有效负载:

{"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)
 {
 }