无法在 iOS 中解析推送通知 json?

Posted

技术标签:

【中文标题】无法在 iOS 中解析推送通知 json?【英文标题】:Not able to Parse Push notification json in iOS? 【发布时间】:2016-04-11 12:20:17 【问题描述】:

我从我的服务器推送通知中得到这个,这是 NSDictionary 格式的。

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler 

     NSLog(@"Recieved remote notification  %@", userInfo);



    aps =     
        alert = "\n      \"GCM\":\n        \"data\":\n          \"notificationType\":\"order\",\n          \"oid\":\"CRN14333313\",\n          \"c\":\"allocated\",\n          \"f\":\"253.633333333333\"   \n      \n    ";
    ;

我正在尝试将其转换为没有任何“\”或“\n”的普通 NSDictionary。我该怎么做?

这种 NSDictionary 格式的预期结果


    aps =     
        alert = " 
                    "GCM"= 
                         "data"= 
                             "notificationType"="ons",
                             "oid"="N14333313",
                             "c"="allocated",
                             "f"="253.633333333333",

                             
                        
                   ";
         ;

【问题讨论】:

你打印这个NSLog(@"Recieved remote notification %@", userInfo);的回复一次 是的,我正在这样做 请原谅...... 那么您在alert 字段中收到了一个JSON?那看起来不太好。查看您发送的 APNS JSON 有效负载。 【参考方案1】:

试试这个,

NSError *jsonError;
NSData *objectData = [@"\n      \"GCM\":\n        \"data\":\n          \"notificationType\":\"order\",\n          \"oid\":\"CRN14333313\",\n          \"c\":\"allocated\",\n          \"f\":\"253.633333333333\"   \n      \n    " dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:objectData
                                                     options:NSJSONReadingMutableContainers
                                                       error:&jsonError];
NSLog(@"dictionary is : %@",json);

我已将您的字符串保持原样。您正在获取 json 字符串作为响应,因此您需要像这样将其转换为 json 对象。希望这能解决您的问题。 :)

【讨论】:

【参考方案2】:

请检查服务器数据的格式,不是json格式,只是简单的字符串

如果你想解析这些数据,那么试试这个,我认为它对你有帮助

NSString *alert_string[userInfo valueForKey:@"aps"] valueForKey:@"alert"];

NSData *jsondata=[alert_string dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *dictionary=[NSJSONSerialization JSONObjectWithData:jsondata options:NSJSONReadingAllowFragments error:nil];

通过使用它,您可以将警报转换为所需格式

【讨论】:

【参考方案3】:

试试这个

NSDictionary *dictionary = userInfo[@"aps"];

【讨论】:

我的问题是转义字符 NSDictionary *dictionary = userInfo[@"aps"][@"alert"][@"GCM"]; NSLog(@"dict: %@", 字典); -[__NSCFString objectForKeyedSubscript:]: 无法识别的选择器发送到实例 0x1503ae6c0【参考方案4】:

您的有效载荷不正确!您不应该在警报中发送 json。那里的文本将在设备上显示为“通知”。

这是带有数据的正确有效负载的外观:


    "aps" : 
        "alert" : 
            "title" : "Game Request",
            "body" : "Bob wants to play poker",
            "action-loc-key" : "PLAY"
        ,
        "badge" : 5
    ,
    "acme1" : "bar",
    "acme2" : [ "bang",  "whiz" ]

如果你的有效载荷是正确的,那么你的字典也是正确的。你不需要解析任何东西。

即,在您的情况下,您从服务器发送的有效负载应如下所示(注意,这不是 JSON,而是对您的 JSON 外观的伪描述):


    aps =     
        alert = "Text that will show up as a push notification";
         ;
    GCM= 
            "data"= 
                  "notificationType"="ons",
                  "oid"="N14333313",
                  "c"="allocated",
                  "f"="253.633333333333",
                    
         

然后你就可以得到你的 GCM 字典了

NSDictionary *dictionary = userInfo[@"GCM"];

有关有效负载的更多信息,请参阅此链接:https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/TheNotificationPayload.html#//apple_ref/doc/uid/TP40008194-CH107-SW1

【讨论】:

以上是关于无法在 iOS 中解析推送通知 json?的主要内容,如果未能解决你的问题,请参考以下文章

从推送通知解析时出现 SwiftyJson 解析问题

无法在 iOS8 上设置交互式推送通知

当应用程序未运行时处理 JSON 推送通知解析

IONIC FCM推送通知ios,无法接收

iOS 推送通知已启用但无法正常工作

从 Apple 推送通知中解析数据