Objective-C Синхронное соединение SSL

Я немного новичок в objective-C, но столкнулся с проблемой, которую я не могу решить, главным образом потому, что я не уверен, что правильно реализую решение.

Я пытаюсь подключиться с помощью синхронного подключения к сайту https с самозаверяющим сертификатом. Я получаю

Ошибка домена = NSURLErrorDomain Code = -1202 "сертификат ненадежного сервера"

Ошибка, что я видел некоторые решения на этом форуме. Решение, которое я нашел, заключалось в том, чтобы добавить:

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {
    return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];  
}  

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
    [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];  

}

в NSURLDelegate принять все сертификаты. Когда я подключаюсь к сайту, используя только:

NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://examplesite.com/"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];  
    NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 

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

Как я могу получить синхронное соединение для использования методов вызова? Это как-то связано с делегатом: самостоятельная часть URLConnection? У меня также есть регистрация для отправки/получения данных в NSURLDelegate, которая вызвана моей функцией соединения, но не синхронной функцией.

Что я использую для синхронной части:

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: [NSURL URLWithString:@"https://examplesite.com/"]];  
        [request setHTTPMethod: @"POST"];  
        [request setHTTPBody: [[NSString stringWithString:@"username=mike"] dataUsingEncoding: NSUTF8StringEncoding]];  
        dataReply = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];  
        NSLog(@"%@", error);  
        stringReply = [[NSString alloc] initWithData:dataReply encoding:NSUTF8StringEncoding];  
        NSLog(@"%@", stringReply);  
        [stringReply release];  
        NSLog(@"Done"); 

Как я уже говорил, я немного новичок в объективе C, поэтому будьте добры:)

Спасибо за любую помощь. Mike

Ответ 1

В соответствии с документами Apple (Руководство по программированию URL-адреса URL-адресов) синхронный метод NSURLRequest не рекомендуется, потому что "поскольку он имеет серьезные ограничения", Похоже, что отсутствие возможности контролировать, какие сертификаты являются приемлемыми, является одним из этих ограничений.

И да, вы правы, именно установка delegate:self в настройке NSURLConnection вызывает вызовы методов делегата. Поскольку простой (или упрощенный) синхронный вызов sendSynchronousRequest: не предоставляет способ указания делегата, эти методы делегата не используются.