2013-12-20 2 views
2

Я написал службу REST, которая обслуживает некоторые данные. Он защищен паролем.Простой пример NSURLSession с аутентификацией

Я пытаюсь написать фоновый процесс, который будет захватывать данные и записывать их в sqlLite db, который у меня есть в приложении.

Я сделал это сначала без проверки подлинности с помощью:

- (void) callWebService { 
    dispatch_sync(kBgQueue, ^{ 
     NSData* data = [NSData dataWithContentsOfURL: 
         scoularDirectoryURL]; 
     [self performSelectorOnMainThread:@selector(fetchedData:) withObject:data waitUntilDone:YES]; 
    }); 
} 

Это работало нормально, но я не думаю, что я могу добавить аутентификацию к этому. Если я смогу, я просто использую это.

Что я ищу, это простое и простое объяснение NSURLSession с использованием аутентификации пользователя/пароля.

ответ

7

Я думаю, что ваш вопрос неопределен и неопределен. Тем не менее, вот одно решение, от here:

-(void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)( NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler 
{ 
    if (_sessionFailureCount == 0) { 
     NSURLCredential *cred = [NSURLCredential credentialWithUser:self.userName password:self.password persistence:NSURLCredentialPersistenceNone];   
    completionHandler(NSURLSessionAuthChallengeUseCredential, cred); 
    } else { 
     completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil); 
    } 
    _sessionFailureCount++; 
} 

Я настоятельно рекомендую вам прочитать и перечитать Apple docs на этом.

+0

Спасибо. Совет будет сделан. –

+0

Просто отметим, что 'NSURLAuthenticationChallenge' содержит' previousFailureCount'. Поэтому на самом деле не требуется поддерживать его отдельно, если у вас нет определенного способа подсчета сбоев. – execv

0

Для меня следующий код работает:

NSString *[email protected]"user:"; 
NSString *[email protected]"password"; 
NSString *authStr= [userName stringByAppendingString:userPassword]; 
NSString *[email protected]"http://000.00.0.0:0000/service.json"; 

NSData *authData = [authStr dataUsingEncoding:NSUTF8StringEncoding]; 
NSString *authValue = [NSString stringWithFormat: @"Basic %@",[authData base64EncodedStringWithOptions:0]]; 
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]]; 
[request setValue:authValue forHTTPHeaderField:@"Authorization"]; 

[NSURLConnection sendAsynchronousRequest:request 
            queue:[NSOperationQueue mainQueue] 

         completionHandler:^(NSURLResponse *response, 
              NSData *data, NSError *connectionError) 

NSDictionary *theDictionary = [NSJSONSerialization JSONObjectWithData:data 
                    options:0 
                    error:NULL]; 

NSDictionary *host = [theDictionary objectForKey : @"host"]; 
     // json nested 
      self.label.text = [host objectForKey:@"key1"]; 
      self.label.text = [host objectForKey:@"key2"]; 

С уважением

Смежные вопросы