gpt4 book ai didi

ios - 从特定 url 提取数据时 NSJSONSerialization 崩溃

转载 作者:行者123 更新时间:2023-11-28 20:22:11 25 4
gpt4 key购买 nike

我正在尝试从此 URL 中提取数据,但遇到了一些问题。为什么这会在 NSJSONSerialization 行崩溃?有没有更好的方法从该网站下载信息?

编辑:我将 jsonArray 从 NSArray 更改为 NSDictionary,但它仍然在同一位置崩溃。是否有不同的方式来下载这些数据?

NSString *url=@"https://api.p04.simcity.com/simcity/rest/users/search/J3d1.json";

NSURLRequest *theRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];

NSURLResponse *resp = nil;
NSError *err = nil;

NSData *response = [NSURLConnection sendSynchronousRequest: theRequest returningResponse: &resp error: &err];

NSDictionary *jsonArray = [NSJSONSerialization JSONObjectWithData: response options: NSJSONReadingMutableContainers error: &err];

NSLog(@"%@",jsonArray);

作为引用,JSON 是:

{
"users": [
{
"uri": "/rest/user/20624",
"tutorialState": 0,
"nucleusId": 20624,
"id": 20624,
"screenName": "R3DEYEJ3D1",
"lastLogin": 1362666027000,
"isOnline": "true",
"avatarImage": "https://api.p04.simcity.com/simcity/rest/user/20624/avatar",
"cities_count": 0,
"canChat": "true"
},
{
"uri": "/rest/user/46326",
"tutorialState": 0,
"nucleusId": 46326,
"id": 46326,
"screenName": "J3D1_WARR10R",
"lastLogin": 1363336534000,
"isOnline": "false",
"avatarImage": "https://api.p04.simcity.com/simcity/rest/user/46326/avatar",
"cities_count": 0,
"canChat": "true"
}
]
}

最佳答案

你的服务器提供了操作系统不信任的证书 - 我不得不使用 -k 标志来 curl 你的 JSON 所以应该想到这一点早些。

为了解决这个问题,您需要切换到使用异步 NSURLConnection 并实现其委托(delegate)方法。从 this stack overflow question 中查看此答案为您的解析问题实现可行的解决方案。我在 app delegate 中实现了它,但是你可以将它放在异步 NSOperation 中并在那里使用它。

警告:此代码将连接到任何服务器,无论是否信任。这是要求中间人攻击。启用此类信任后,请勿将敏感信息发送到服务器。您必须实现代码来验证服务器的身份,并替换 - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 中的 if (YES)对该检查的结果进行测试。

我目前的理解是,这应该通过将您的证书的公钥作为 DER 文件包含在应用程序包中,并使用 SecCertificateCreateWithData 创建一个 SecCertficiateRef 来完成用作 SecTrustSetAnchorCertificates 的输入。然后,应该使用 SecTrustEvaluate 来验证身份。我的理解基于我对 Certificate, Key, and Trust Services Reference 的阅读和在 this blog post 中找到的示例代码关于如何信任您自己的证书。

@interface AppDelegate () <NSURLConnectionDelegate, NSURLConnectionDataDelegate>

// This is needed to collect the response as it comes back from the server
@property (nonatomic, strong) NSMutableData *mutableResponseData;

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Xcode template code for setting up window, ignore...
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
self.viewController = [[ViewController alloc] initWithNibName:@"ViewController_iPhone" bundle:nil];
} else {
self.viewController = [[ViewController alloc] initWithNibName:@"ViewController_iPad" bundle:nil];
}
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];

// Instantiate our connection
NSString *urlString = @"https://api.p04.simcity.com/simcity/rest/users/search/J3d1.json";
NSURL *url = [NSURL URLWithString:urlString];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
if(![NSURLConnection connectionWithRequest:request delegate:self]) {
NSLog(@"Handle an error case here.");
}

return YES;
}


- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
// Prepare to recevie data from the connection
NSLog(@"did receive response: %@", response);
self.mutableResponseData = [NSMutableData data];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
// Handle an error case here
NSLog(@"did fail with error: %@", error);
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
// Build up the response data
[self.mutableResponseData appendData:data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSError *error = nil;
id JSONObject = [NSJSONSerialization JSONObjectWithData:self.mutableResponseData options: NSJSONReadingMutableContainers error:&error];
if (!JSONObject) {
// Handle error here
NSLog(@"error with JSON object");
}
else if ([JSONObject isKindOfClass:[NSDictionary class]]) {
//we're in business
NSDictionary *dict = JSONObject;
NSLog(@"dict is %@", dict);
}
else {
// Handle case of other root JSON object class...
}
}


// The following two methods allow any credential to be used. THIS IS VULNERABLE TO MAN IN THE MIDDLE ATTACK IN ITS CURRENT FORM
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace
{
return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];
}

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
// WE ARE POTENTIALLY TRUSTING ANY CERTIFICATE HERE. Replace YES with verification of YOUR server's identity to avoid man in the middle attack.
// FOR ALL THAT'S GOOD DON'T SHIP THIS CODE
#warning Seriously, don't ship this.
if (YES) {
[challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
}
}

[challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}

@end

关于ios - 从特定 url 提取数据时 NSJSONSerialization 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15465178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com