展开字典数组

Unwrap array of dictionary

我有一组来自 firebase 的字典,如下所示:

"gcm.notification.data" = "{\"request\":\"update_location\",\"latitude\":\"45.48945419494574\",\"customMessage\":{\"loc-args\":[\"iPhone di Tester\"],\"loc-key\":\"LOCATION_CHECKIN\"},\"type\":\"checkin\",\"message\":\"Ggg\",\"longitude\":\"9.195329826333742\",\"child\":{\"name\":\"iPhone di Tester\",\"pid\":\"C312EDDC-E8A8-4EFC-9E65-957BE5DAC5FC\"}}";

我试着打开请求,就像下面这样但是它崩溃了,谁能帮忙。

 NSDictionary *gcmnotificationdat = [userInfo objectForKey:@"gcm.notification.data"];
    NSString *request = [gcmnotificationdat objectForKey:@"request"];

你遇到了崩溃。作为开发人员,阅读它很重要。你要么看不懂,要么看得懂,但一定要找找看,这个是比较有名的。这是任何 iOS 开发人员都应该知道的基本崩溃消息。 如果你不这样做,请与我们分享。您将有更好的机会获得答案。

最重要的部分是:

-[__NSCFConstantString objectForKey:]: unrecognized selector sent to instance 0x100002090

这意味着您正试图在 NSString 对象上调用方法 objectForKey:NSString 不知道,这就是它崩溃的原因。

gcm.notification.data 的值是 JSON 字符串化的。

所以 [userInfo objectForKey:@"gcm.notification.data"]; 实际上是 NSString 而不是 NSDictionary

我们现在修复它:

//Creation of the sample for the sake of the test
NSDictionary *userInfo = @{@"gcm.notification.data": @"{\"request\":\"update_location\",\"latitude\":\"45.48945419494574\",\"customMessage\":{\"loc-args\":[\"iPhone di Tester\"],\"loc-key\":\"LOCATION_CHECKIN\"},\"type\":\"checkin\",\"message\":\"Ggg\",\"longitude\":\"9.195329826333742\",\"child\":{\"name\":\"iPhone di Tester\",\"pid\":\"C312EDDC-E8A8-4EFC-9E65-957BE5DAC5FC\"}}"};

//Parsing
NSString *gcmNotificationJSONString = [userInfo objectForKey:@"gcm.notification.data"];
NSData *gcmNotificationJSONData = [gcmNotificationJSONString dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *gcmNotification = [NSJSONSerialization JSONObjectWithData:gcmNotificationJSONData options:0 error:nil];
NSString *request = [gcmNotification objectForKey:@"request"];
NSLog(@"Request: %@", request);

注意:我删除了您使用的 var 名称的 "dat" 部分,因为键以 "data" 结尾,以免混淆 NSStringNSDataNSDictionary 正如我从 class 中明确命名的那样。我在评论中输错了 class,请小心并从此处的代码中修复它。