0

只是一个快速的我如何检测登录是否失败这是我的代码:

- (IBAction)btnTimetable:(id)sender {
    NSString *user = _txtUsername.text;
    NSString *pass = _txtPassword.text;
    NSString *content = [NSString stringWithFormat:@"username=%@&password=%@", user, pass];
    NSData *data =[content dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
    NSString *postlenght=[NSString stringWithFormat:@"%lu",(unsigned long)[data length]];

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://moodle.thomroth.ac.uk/login/index.php?mode=login"]];
    [request setHTTPMethod:@"POST"];
    [request setValue:postlenght forHTTPHeaderField:@"Content-Length"];
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Length"];
    [request setHTTPBody:data];
    //NSError *error=nil;
    //NSURLResponse *response=nil;
    //NSData *result=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

    [_webView loadRequest:request];
    [self performSelector:@selector(parseTimetable) withObject:nil afterDelay:3.0];
}

我什至不知道从哪里开始这个有没有一种委托方法来检测这种行为?

4

2 回答 2

0

正如官方开发者论坛中所述,UIWebView 不支持 iOS 中的身份验证挑战。请在此处阅读(需要开发者帐户):UIWebView 不直接支持身份验证挑战

sendSynchronousRequest:returningResponse:error:应该返回nil并且返回响应的状态码应该等于401(未授权):

[(NSHTTPURLRequest*)response statusCode] == 401

我猜想,错误参数应该设置为相应的错误(请通过将其打印到控制台来检查)。

如果使用委托方式NSURLConnection的情况就不同了:

NSURLConnection收到 401 时(例如,连接需要用于身份验证的凭据,或者之前的身份验证尝试失败),它会调用委托

- (void)connection:(NSURLConnection *)connection
  willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;

如果实现,则调用这些(现在被认为是过时的方法):

- (BOOL)connection:(NSURLConnection *)connection 
    canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace;

- (void)connection:(NSURLConnection *)connection 
    didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge;

- (BOOL)connectionShouldUseCredentialStorage:(NSURLConnection *)connection;

如果实施。

官方文档提供了更多信息:NSURLConnectionDelegate 协议参考

如果您决定这样做,您可以取消身份验证请求。因此,连接可能会失败。

如果连接失败,connection:didFailWithError将被调用。

于 2013-10-11T19:56:00.443 回答
0

如果您真的想使用 UIWebView 来做,您可以使用它的委托方法并解析您网站的代码答案。

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    NSString *webSource = [_web stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML"];
}
于 2013-10-11T20:22:26.137 回答