我正在尝试让Twitter在我的应用程序中运行,一切正常,但代码似乎没有识别来自Twitter的错误。如果用户名/密码无效,我会通过此函数收到错误消息:
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
NSString* strData = [[[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:NSASCIIStringEncoding] autorelease];
NSLog(@"Received data: %@", strData ) ;
return ;
}
打印:收到的数据: 无法验证您的身份。 。
然而,应用程序继续发布我有的推文视图并忽略错误。显然,我没有设置权利从twitter检测到这样的错误,所以我的问题是如何让Xcode识别出这样的错误?这使用了基本的http auth btw并且没有提及任何关于OAuth的内容......只是试图让它现在正常工作。
-(void) onLogin:(id)sender
{
[loading1 startAnimating];
NSString *postURL = @"http://twitter.com/account/verify_credentials.xml";
NSMutableURLRequest *request = [ [ NSMutableURLRequest alloc ] initWithURL: [ NSURL URLWithString:postURL ] ];
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:request delegate:self];
if (!theConnection)
{
UIAlertView* aler = [[UIAlertView alloc] initWithTitle:@"Network Error" message:@"Failed to Connect to twitter" delegate:nil cancelButtonTitle:@"Close" otherButtonTitles:nil];
[aler show];
[aler release];
}
else
{
receivedData = [[NSMutableData data] retain];
}
[request release];
}
-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
if ([challenge previousFailureCount] == 0 && ![challenge proposedCredential])
{
NSURLCredential *newCredential;
newCredential=[NSURLCredential credentialWithUser:txtUsername.text
password:txtPassword.text
persistence:NSURLCredentialPersistenceNone];
[[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge];
}
else
{
isAuthFailed = YES;
[[challenge sender] cancelAuthenticationChallenge:challenge];
}
}
答案 0 :(得分:3)
您的代表需要实施......
-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
如果您尝试连接的服务器需要身份验证,那么应该调用哪个。这是我的一个程序中的一些示例代码......
-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
if ([challenge previousFailureCount] == 0) {
NSURLCredential *newCredential;
newCredential=[NSURLCredential credentialWithUser:_username
password:_password
persistence:NSURLCredentialPersistenceNone];
[[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge];
} else {
[[challenge sender] cancelAuthenticationChallenge:challenge];
NSLog(@"Bad Username Or Password");
}
}
}
答案 1 :(得分:0)
方法- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
被调用零次或多次,具体取决于可用的数据量。
如果是网络请求,很可能会多次调用它。您需要做的是创建一个NSMutableData
对象并将其存储为实例变量。然后,当调用此方法时,您需要将新数据附加到NSMutableData
对象,如下所示:
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
//myMutableData should be an instance of NSMutableData and stored as an instance variable in your class. Don't forget to initialise it.
[myMutableData appendData:data];
}
如果你不这样做,你可能会错过部分回复。
我不确切知道您执行请求的方式或回复的响应类型,但理想情况下,您需要使用XML或JSON格式的响应,并且您应该使用解析器将响应转换为你可以使用的东西。
这样,您就可以提取错误代码,消息等,并相应地对其进行操作。
最后,如果您要从应用程序中使用Twitter,请考虑使用像MGTwitterEngine这样的预建库。它会为你节省很多悲伤和麻烦。此外,即使您说不提及它,MGTwitterEngine现在也支持OAuth,这将节省您在关闭基本身份验证后修改代码的时间。
答案 2 :(得分:0)
好的,我现在可以在xml中获得错误响应或身份验证响应。现在,我怎么说,使用这个响应作为connectionDidFailWithError的触发因素,因为如果twitter发回错误,我想给出一个应用内错误。
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[receivedData appendData:data];
NSXMLParser* parser = [[NSXMLParser alloc] initWithData:data];
[parser setDelegate:self];
[parser parse];
return;
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSMutableString *)string
{
NSLog(@"response: %@", string);
}