Search code examples
iosnsurlconnectionafnetworkingnsurlrequest

NSURLConnection only authenticates on second attempt


I am trying to load a secure website in a UIWebView my basic approach is to create a NSURL, the n a NSURLRequest, then a NSURLConnection, then to load the NSURLRequest in the UIWebView. When the website is loaded I receive

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

I respond to the challenge sender with

- (void)useCredential:(NSURLCredential *)credential forAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge

But after that I get nothing... it just hangs. I put in break points so I know that

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

is being called. If I wait till I am sure that the NSURLConnection is not going to complete then reload the view no authentication challenge is sent but the view will load. I do not have any control over the server. I am open to using AFNetworking, but only if necessary.

The full listing of source code is provided below:

 - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:

    (NSURLAuthenticationChallenge *)challenge
    {
      NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
      if ([challenge previousFailureCount] == 0)
  {
    NSString *username = @"username";
    NSString *password = @"passsword";
    NSURLCredential * cred = [NSURLCredential credentialWithUser:username
                                                        password:password
                                                     persistence:NSURLCredentialPersistenceForSession];
    [[challenge sender] useCredential:cred forAuthenticationChallenge:challenge];
  }
  else
  {

  }
}

-(void)updateCard
{
  NSURL * url = [NSURL URLWithString:@"https://ssl.letu.edu/applications/chapelattendance/attendance.html"];
  NSURLRequest * request = [NSURLRequest requestWithURL:url
                                            cachePolicy:NSURLRequestUseProtocolCachePolicy
                                        timeoutInterval:50.0];
  self.webView =[[UIWebView alloc] initWithFrame:self.bounds];
  self.webView.delegate = self;
  [self.webView loadRequest:request];
  self.connection = [[ NSURLConnection alloc]initWithRequest:request delegate:self];
  [self.connection start];
}

Where did I go wrong?


Solution

  • If anyone comes along and has the same problem be sure I want to share the solution I found. Use AFNetworking.

    Here is the revised code:

    -(void)updateCard
    {
      if(!self.webView)
      {
        self.webView =[[UIWebView alloc] initWithFrame:self.bounds];
        self.webView.delegate = self;
      }
      NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults];
      NSString *username = @"username";
      NSString *password = @"password";
      NSURL *url = [NSURL URLWithString:@"https://ssl.letu.edu/"];
      AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL: url];
    
      [client setAuthorizationHeaderWithUsername:username password:password];
    
      NSMutableURLRequest *request = [client requestWithMethod:@"GET" path:@"applications/chapelattendance/attendance.html"
                                                    parameters:nil];
    
      AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    
      [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject)
      {
        [self.webView loadRequest:request];
      }
                                       failure: ^(AFHTTPRequestOperation *operation, NSError *error)
      {
        NSLog(@"Could not load chapel attendance");
      }];
    
      NSOperationQueue *queue = [[NSOperationQueue alloc] init];
      [queue addOperation:operation];
    }