Я новичок в Objective- C, и я работал над старым кодом, пытаясь динамически проверять, следует ли игнорировать ошибки SSL-сертификата или нет. Я уже установил делегат NSURLConnection
и его методы:
@interface Downloader : NSObject <NSURLConnectionDelegate>
-(void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:( NSURLAuthenticationChallenge *)challenge;
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;
-(void)connectionDidFinishLoading:(NSURLConnection *)connection;
Реализация:
-(void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge{
if([self.ignoreCertificateErrors isEqualToString:@"false"]){
if([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust])
[challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
}
[challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
CFRunLoopStop(CFRunLoopGetCurrent());
_downloadError = error;
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[_downloadData appendData: data];
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSError * error;
[_downloadData writeToFile:_downloadDest options:NSDataWritingAtomic error:&error];
}
Проблема, с которой я столкнулся, заключается в том, что -(void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:( NSURLAuthenticationChallenge *)challenge
не вызывается перед каждым download, поэтому свойство не проверяется, и загрузка происходит независимо от значения переменной.
Кто-нибудь знает, что может заставить NSURLConnection
игнорировать свои собственные методы делегата?
(Кроме того, загрузки происходит асинхронно с использованием NSRunLoop currentRunLoop
Я знаю, что это старая проблема, но ни один из других ответов не решил эту проблему для меня.
Это отрывок из кода, который выполняет асинхронную загрузку:
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
dispatch_queue_t downloadQueue = dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0 );
dispatch_async(downloadQueue, ^{
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request
delegate:self
startImmediately:NO];
[connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[connection start];
[ [ NSRunLoop currentRunLoop ] run ];
dispatch_semaphore_signal(semaphore);
[connection release];
});
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);