Created
November 21, 2008 11:40
-
-
Save jfahrenkrug/27421 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 2008 by Johannes Fahrenkrug, http://blog.springenwerk.com | |
@implementation AccountViewController | |
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { | |
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { | |
// Initialization code | |
self.title = @"Settings"; | |
// NSMutableData * declared in .h | |
receivedData = [[NSMutableData data] retain]; | |
} | |
return self; | |
} | |
- (IBAction)login:(id)sender { | |
//display an alert if either username or pwd are empty | |
if ([[usernameTextField text] length] < 1 || [[passwordTextField text] length] < 1) { | |
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Login" message:@"Neither the username nor password may be empty!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; | |
[alert show]; | |
[alert release]; | |
return; | |
} | |
// reset the credentials cache... | |
NSDictionary *credentialsDict = [[NSURLCredentialStorage sharedCredentialStorage] allCredentials]; | |
if ([credentialsDict count] > 0) { | |
// the credentialsDict has NSURLProtectionSpace objs as keys and dicts of userName => NSURLCredential | |
NSEnumerator *protectionSpaceEnumerator = [credentialsDict keyEnumerator]; | |
id urlProtectionSpace; | |
// iterate over all NSURLProtectionSpaces | |
while (urlProtectionSpace = [protectionSpaceEnumerator nextObject]) { | |
NSEnumerator *userNameEnumerator = [[credentialsDict objectForKey:urlProtectionSpace] keyEnumerator]; | |
id userName; | |
// iterate over all usernames for this protectionspace, which are the keys for the actual NSURLCredentials | |
while (userName = [userNameEnumerator nextObject]) { | |
NSURLCredential *cred = [[credentialsDict objectForKey:urlProtectionSpace] objectForKey:userName]; | |
NSLog(@"cred to be removed: %@", cred); | |
[[NSURLCredentialStorage sharedCredentialStorage] removeCredential:cred forProtectionSpace:urlProtectionSpace]; | |
} | |
} | |
} | |
// Note the magic hash that makes it all work! -------------------------------------------------------------------------------V | |
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://localhost:3000/something.json#"] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20]; | |
NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; | |
if (!theConnection) { | |
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Network Error" message:@"Could not login!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; | |
[alert show]; | |
[alert release]; | |
return; | |
} | |
} | |
#pragma mark urlconnection delegate methods | |
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response | |
{ | |
// this method is called when the server has determined that it | |
// has enough information to create the NSURLResponse | |
// it can be called multiple times, for example in the case of a | |
// redirect, so each time we reset the data. | |
// receivedData is declared as a method instance elsewhere | |
[receivedData setLength:0]; | |
} | |
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data | |
{ | |
// append the new data to the receivedData | |
// receivedData is declared as a method instance elsewhere | |
[receivedData appendData:data]; | |
} | |
- (void)connection:(NSURLConnection *)connection | |
didFailWithError:(NSError *)error | |
{ | |
[connection release]; | |
// inform the user | |
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Login Error" message:[NSString stringWithFormat:@"The connection failed with this error: %@", [error localizedDescription]] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; | |
[alert show]; | |
[alert release]; | |
NSLog(@"Connection failed! Error - %@ %@", | |
[error localizedDescription], | |
[[error userInfo] objectForKey:NSErrorFailingURLStringKey]); | |
} | |
- (void)connectionDidFinishLoading:(NSURLConnection *)connection | |
{ | |
NSLog(@"login succeeded!"); | |
[connection release]; | |
NSString *response = [NSString stringWithCString:[receivedData bytes] length:[receivedData length]]; | |
NSLog(response); | |
} | |
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { | |
NSLog(@"got auth challange"); | |
if ([challenge previousFailureCount] == 0) { | |
[[challenge sender] useCredential:[NSURLCredential credentialWithUser:[usernameTextField text] password:[passwordTextField text] persistence:NSURLCredentialPersistenceForSession] forAuthenticationChallenge:challenge]; | |
} else { | |
[[challenge sender] cancelAuthenticationChallenge:challenge]; | |
} | |
} | |
- (void)dealloc { | |
[receivedData release]; | |
[super dealloc]; | |
} | |
@end | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment