1

У меня есть метод для http-соединения, который работал отлично для меня, пока сервер не попытался получить недействительный сертификат ssl. Поскольку я используюМетод NSURLConnection необходимо изменить, чтобы пройти проверку подлинности

[NSURLConnection sendSynchronousRequest:returningResponse:error] 

Там нет никаких шансов пройти аутентификацию вызов с помощью NSURLConnection методы делегата.

Теперь мне нужно как можно быстрее изменить код вызова службы. Мой метод возвращает данные, полученные от связи, что является основной проблемой я не могу легко изменить мину NSURLConnection к initWithRequest:delegate:

Мой метод вызова службы заключается в следующем;

-(id)serviceCall:(NSString*)str withURL:(NSString*)serviceUrl withIdentifier:(NSString*)type 
{ 
    globalURL = [[NSURL alloc] initWithString:serviceUrl]; 
    shouldAllowSelfSignedCert = YES; 

// if(ISDEBUG) NSLog(@"%@",serviceUrl); 

    NSMutableDictionary* json; 
    NSURLResponse* response; 
    NSData* responseData = [NSMutableData data]; 

    NSError* error = nil; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:globalURL]; 
    [request setHTTPMethod:@"POST"]; 
    [request setHTTPBody: [str dataUsingEncoding: NSUTF8StringEncoding]]; 
    NSString* msgLength = [[NSString alloc] initWithFormat:@"%lu", (unsigned long)[str length]]; 
    [request addValue:@"text/json; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; 
    [request addValue:msgLength forHTTPHeaderField:@"Content-Length"]; 
    request.timeoutInterval = 180; 

    responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 


    if([type isEqualToString:@"image"]) 
    { 
     if(ISDEBUG) NSLog(@"%@",responseData); 
     return responseData; 
    } 
    else 
    { 
     if(error) 
     { 
      UIAlertView *message = [[UIAlertView alloc] initWithTitle:NO_WS_CONNECTION message:@"" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil]; 

      if(ISDEBUG) NSLog(@"%@",error); 
     } 
     else 
     { 
      if(responseData !=nil) 
      { 
      json = [NSJSONSerialization 
        JSONObjectWithData:responseData 

        options:kNilOptions 
        error:&error]; 
      } 
      else 
      { 

      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:NO_WS_CONNECTION delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil]; 
      [alert show]; 
      } 
     } 

    NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 

     if(ISDEBUG) NSLog(@"%@",responseString);  
    } 

    return json; 
} 

Надеюсь, я достаточно ясен.

Что посоветую?

Спасибо.

ответ

2

У вас должна быть веская причина сделать это синхронно, поэтому я постараюсь помочь вам, не меняя поток.

Попробуйте обернуть запрос в класс, где вы можете реализовать запрос с использованием initWithRequest:delegate: и заставить класс возвращать ответ с помощью блока.

Вы будете иметь что-то вроде:

[YourRequestClass requestWithURL:serviceURL callback:^(NSData *yourData, NSError *error){ 

}]; 

Хорошо, в этот момент у вас есть новый инструмент, который делает асинхронные запросы, сделать вызов аутентификации вещи для вас и возвращает результат на блоке.

Теперь, вы можете просто использовать dispatch_semaphore, чтобы заблокировать поток, пока запрос не возвращает ответ ....

-(id)serviceCall:(NSString*)str withURL:(NSString*)serviceUrl withIdentifier:(NSString*)type { 

    __block NSData *myData = nil; 

    dispatch_semaphore_t sem = dispatch_semaphore_create(0); 

    [YourRequestClass requestWithURL:serviceUrl callback:^(NSData *yourData, NSError *error){ 
     //ignoring error (this is an example !) 
     myData = yourData; 
     dispatch_semaphore_signal(sem); 
    }]; 

    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); 

    //Use myData and make yourObject here! 

    return yourObject; 
} 

Обратите внимание, что это всего лишь пример, и я просто пытаюсь указывать вам право путь ... Я не тестировал этот код, но считаю, что он должен работать так, как ожидалось!

+0

В качестве альтернативы вы можете добавить пароль к брелкам пользователя, а синхронные URL-адреса будут использоваться по умолчанию. С учетом сказанного, переход к асинхронному стилю определенно является правильным решением в долгосрочной перспективе. – dgatwood