展开字典数组
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" 结尾,以免混淆 NSString
、NSData
和 NSDictionary
正如我从 class 中明确命名的那样。我在评论中输错了 class,请小心并从此处的代码中修复它。
我有一组来自 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" 结尾,以免混淆 NSString
、NSData
和 NSDictionary
正如我从 class 中明确命名的那样。我在评论中输错了 class,请小心并从此处的代码中修复它。