【问题标题】:Xamarin iOS cant get a specific variable from a PushNotification PayloadXamarin iOS 无法从 PushNotification Payload 获取特定变量
【发布时间】:2017-06-16 09:00:04
【问题描述】:

通过发送以下 APNS-Payload:

{"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”等于payload中的key,则变量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 将被设置。如果调用payload中的数组:idArray,objid = null

这真的很奇怪。我希望有人可以提供帮助。

【问题讨论】:

    标签: c# xamarin push-notification xamarin.ios nsdictionary


    【解决方案1】:

    因此,尽管我不完全理解您的问题,但正如您自己所说,您可以通过直接提取“objid”来解决问题,但您的有效负载和代码中需要修改一些内容以遵守最佳做法。

    我认为有效载荷应该如下:(您在 objid 和 idArray 的末尾错过了一些定义括号)。

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

    此外,您的代码未正确使用 null 传播,将来会导致您出现问题。如果您检查 null,您还必须传播 Count 否则可能会导致抛出异常。

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

    还值得注意的是,JSON 通常会以小写形式反序列化属性名称。然而,这在反序列化器之间可能会有所不同。

    【讨论】:

    • 谢谢,但重点如下:如果我在有效负载中写入“idArray”,则不会设置objid,如果我写入“idarray”(或删除“idArray”),则会设置objid。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 2012-08-18
    相关资源
    最近更新 更多