Глобальная регистрация NSRULProtocol для NSURLSessions

Я пытаюсь использовать NSURLProtocol для обработки задач аутентификации для каждого соединения NSURLSession. я использовал

  [NSURLProtocol registerClass:[CustomHTTPSProtocol class]] 

для NSURLConnection. Но он не работает с NSURLSession, поэтому мне нужно установитьSessionConfiguration.protocolClasses=@[[CustomHTTPSProtocol class]];. Проблема в том, что я использую этот класс URLProtocol только для обработки задач аутентификации, и я получаю полученные данные в делегатах исходного класса.

Что-то вроде этого

Исходный класс

NSURLConnection

 -(void)sendURL
 {
   [NSURLProtocol registerClass:[CustomHTTPSProtocol class]];  //done globally in didFinishLaunching
    self.URL =[NSURL URLWithString:[[NSString stringWithFormat:@"https://www.google.co.in"]stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]];
NSMutableURLRequest *request=[[NSMutableURLRequest alloc]initWithURL:self.URL];
 self.connection=[NSURLConnection connectionWithRequest:request delegate:self];
  }

 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
 {
   NSlog(@"received data...%@",data);
  }

NSURLSession

-(void)sendURL
 {
    self.URL =[NSURL URLWithString:[[NSString stringWithFormat:@"https://www.google.co.in"]stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]];
  NSMutableURLRequest *request=[[NSMutableURLRequest alloc]initWithURL:self.URL];
  sessionConfiguration =[NSURLSessionConfiguration defaultSessionConfiguration];
  sessionConfiguration.protocolClasses=@[[CustomHTTPSProtocol class]];
 NSURLSession *session = [NSURLSession sessionWithConfiguration:sessionConfiguration delegate:self delegateQueue:nil];
   NSURLSessionDataTask*task=  [session dataTaskWithRequest:checkInInfoRequest];
    [task resume];
   }

   - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
  {
 NSLog(@"data ...%@  ",data); //handle data here
  }

Класс протокола NSURL

NSURLConnection

-(void)startLoading
 {
   NSMutableURLRequest *newRequest = [self.request mutableCopy];
[NSURLProtocol setProperty:@YES forKey:CustomHTTPSProtocolHandledKey inRequest:newRequest];

  self.connection=[NSURLConnection connectionWithRequest:newRequest delegate:self];

 }

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

if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust])
{
    [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];

}
else
{
    [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}

}

NSURLSession

 - (void) startLoading {

NSMutableURLRequest *newRequest = [self.request mutableCopy];
[NSURLProtocol setProperty:@YES forKey:CustomHTTPSProtocolHandledKey inRequest:newRequest];

NSURLSession*session=[NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:nil];
self.sessionTask=[session dataTaskWithRequest:newRequest];
[self.sessionTask resume];
 }

 - (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler{

if([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]){

    NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
    completionHandler(NSURLSessionAuthChallengeUseCredential,credential);
   }
 }

Используя приведенную выше логику, я смог выполнить аутентификацию для всех запросов в глобальном масштабе и обработать ответ по отдельности. Но с NSURLSession, если я использую NSURLProtocol, аутентификация выполняется в классе протокола, но я не могу получать данные, так как мои исходные делегаты класса не вызываются.

Кто-нибудь, помогите мне.


person vishnuvarthan    schedule 26.08.2015    source источник


Ответы (1)


Когда вы реализуете выполнение запроса самостоятельно (или повторно отправляете его, как вы это делали), ваш протокол становится отправителем запроса. Вы несете ответственность за создание объекта NSURLAuthenticationChallenge, установку себя в качестве отправителя, предоставление всех остальных битов из существующего запроса и его отправку с использованием класса NSURLProtocolClient.

Взгляните на CustomHTTPProtocol Sample Code от Apple. проект для примеров и дополнительной информации.

person dgatwood    schedule 28.10.2015