Iphone 更新到OS3.1后,stringWithContentsOfUrl失败
我有一个应用程序一直在愉快地运行,但由于我更新到OS3.1并更新了SDK,该应用程序无法登录到远程服务器,将连接字符串传递给stringWithContentsOfUrl函数 在更新之前,这工作正常,如果我复制NSLog语句上显示的文本字符串并将其粘贴到浏览器中,那么我会得到正确的响应,但是,这是以“LOGIN_ERROR”表示失败的响应 你知道为什么这会失败,以及如何修复它吗Iphone 更新到OS3.1后,stringWithContentsOfUrl失败,iphone,objective-c,url,Iphone,Objective C,Url,我有一个应用程序一直在愉快地运行,但由于我更新到OS3.1并更新了SDK,该应用程序无法登录到远程服务器,将连接字符串传递给stringWithContentsOfUrl函数 在更新之前,这工作正常,如果我复制NSLog语句上显示的文本字符串并将其粘贴到浏览器中,那么我会得到正确的响应,但是,这是以“LOGIN_ERROR”表示失败的响应 你知道为什么这会失败,以及如何修复它吗 NSString* userName = [[NSUserDefaults standardUserDefaults]
NSString* userName = [[NSUserDefaults standardUserDefaults] stringForKey:@"username_pref"];
NSString* password = [[NSUserDefaults standardUserDefaults] stringForKey:@"password_pref"];
NSString* loginUrl = [NSString stringWithFormat:@"https://website.com/API/login?email=%@&password=%@", userName, password];
NSLog (@"Logging in as %@ using %@ at [%@]", userName, password, loginUrl);
NSURL* url = [NSURL URLWithString:loginUrl];
NSString* loginDetails = [NSString stringWithContentsOfURL:url encoding:NSASCIIStringEncoding error:nil];
if ([loginDetails compare:@"\"LOGIN_ERROR\""] == NSOrderedSame)
{
DLog (@"Login Failed : LOGIN_ERROR");
self.isLoggedIn = NO;
}
else
{
DLog (@"Login Success");
if (userDetails) {
[userDetails release];
}
NSDictionary* jsonData = [loginDetails JSONValue];
userDetails = [[[DMUserDetails alloc] init] retain];
userDetails.id = [[jsonData objectForKey:@"id"] intValue];
userDetails.api_token = [jsonData objectForKey:@"api_token"];
userDetails.full_name = [jsonData objectForKey:@"full_name"];
userDetails.mobile_number = [jsonData objectForKey:@"mobile_number"];
userDetails.mobile_host = [jsonData objectForKey:@"mobile_host"];
userDetails.email = [jsonData objectForKey:@"email"];
userDetails.twitter = [jsonData objectForKey:@"twitter"];
userDetails.jabber = [jsonData objectForKey:@"jabber"];
userDetails.msn = [jsonData objectForKey:@"msn"];
userDetails.start_page = [jsonData objectForKey:@"start_page"];
userDetails.date_format = [[jsonData objectForKey:@"date_format"] intValue];
userDetails.time_format = [[jsonData objectForKey:@"time_format"] intValue];
userDetails.sort_order = [[jsonData objectForKey:@"sort_order"] intValue];
userDetails.timezone = [jsonData objectForKey:@"timezone"];
userDetails.tz_offset = [jsonData objectForKey:@"tz_offset"];
userDetails.premium_until = [jsonData objectForKey:@"premium_until"];
userDetails.default_reminder = [jsonData objectForKey:@"default_reminder"];
self.isLoggedIn = YES;
}
[self performSelectorOnMainThread:@selector(didFinishLogon) withObject:nil waitUntilDone:NO];
最可能的问题是loginDetails为nil,表示检索URL时出错,而不是您实际收到“LOGIN error”响应 传入错误对象并记录错误。尝试:
NSError *error = nil;
NSString *loginDetails = [NSString stringWithContentsOfURL:url encoding:NSASCIIStringEncoding error:&error];
if (error != nil) {
NSLog(@"%@", error);
}
如果您的用户名是电子邮件地址,并且其中有at符号(@),您是否尝试使用%40而不是@来逃避URL中的at符号?如果可能的话,您可能需要查看web服务器日志。不幸的是,它不是我的web服务器,因此这是不可能的代码对我来说很好。返回消息是否发生了更改,可能是在不同的服务器之间?奇怪的是,没有。将URL复制并粘贴到浏览器中可以正常工作。所以我知道字符串是正确的。但是通过stringWithContentsOfUrl方法传递它失败了,这表明它正在更改传递的内容,或者它正在以不同的方式传递它,我无法确定是什么原因,我已经通过实现NSURLRequest和NSURLConnection修复了它。意味着我必须调整获取内容的方式。我没有收到任何连接错误,但是我收到了来自服务器的错误响应,这表明用户名和密码是错误的,但是输出证明它们是错误的(可能是字符编码?)。有趣的是,这似乎只是这个调用的一个问题,它是https而不是http。其余的http调用工作正常。如果失败,服务器返回字符串“LOGIN\u ERROR”,但我访问的URL是正确的。如果我将日志中的字符串复制并粘贴到浏览器中,效果会很好。