Методы делегата NSURLSession не вызываются

Я создал очень простое приложение для загрузки текстового файла с моего веб-сервера. У меня это отлично работает с NSURLConnection, но вместо этого я пытаюсь перейти на NSURLSession.

Проблема, с которой я сталкиваюсь, заключается в том, что ни один из методов делегата не вызывается.

Мой сервер защищен паролем, поэтому мне нужно использовать базовую HTTP-аутентификацию для доступа к файлу, но когда метод didReceiveChallenge никогда не вызывается.

Строка кода [getFileTask резюме], похоже, ни на что не влияет.

Моя установка выглядит следующим образом:

@interface ViewController : UIViewController <NSURLSessionDelegate, NSURLSessionDownloadDelegate, NSURLSessionTaskDelegate>
{
   NSURLSession *session;
}

Следующий метод вызывается из viewDidLoad:

-(void)setUpTheNetworking
{
    NSString *fileURL = @"www.mywebsite.com/utility/file.txt";

    NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
    sessionConfig.allowsCellularAccess = YES;
    sessionConfig.timeoutIntervalForRequest = 10;
    sessionConfig.timeoutIntervalForResource = 10;
    sessionConfig.HTTPMaximumConnectionsPerHost = 1;

    session = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil];

    NSURLSessionDownloadTask *getFileTask = [session downloadTaskWithURL:[NSURL URLWithString:fileURL]];

    [getFileTask resume];
}

Методы делегата, которые я реализовал:

-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
    NSLog(@"Here we go");
}

-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes
{
    NSLog(@"Here we go");
}

-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
{
    NSLog(@"Here we go");
}

- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler
{
   if (challenge.previousFailureCount == 0)
   {
       NSURLCredentialPersistence persistence = NSURLCredentialPersistenceForSession;
       NSURLCredential *credential = [NSURLCredential credentialWithUser:user password:@password persistence:persistence];
       completionHandler(NSURLSessionAuthChallengeUseCredential, credential);
   }
   else
   {
       // handle the fact that the previous attempt failed
       NSLog(@"%s: challenge.error = %@", __FUNCTION__, challenge.error);
       completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil);
   }
}

 - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
   didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
   completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler
{
    {
        if (challenge.previousFailureCount == 0)
        {
             NSURLCredential *credential = [NSURLCredential  credentialWithUser:user password:password persistence:NSURLCredentialPersistenceForSession];
        completionHandler(NSURLSessionAuthChallengeUseCredential, credential);
        }
        else
        {
            NSLog(@"%s; challenge.error = %@", __FUNCTION__, challenge.error);
            completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil);
        }

    }
}

Спасибо!


person Scooter    schedule 18.01.2014    source источник


Ответы (1)


РЕШЕНО!

Виновником была следующая строка кода:

 NSString *fileURL = @"www.mywebsite.com/utility/file.txt";

Оказывается, здесь также нужен http://, так что этот работает

 NSString *fileURL = @"http://www.mywebsite.com/utility/file.txt";

Мне до сих пор кажется странным, что это просто не сработало. Я ожидал, что всплывет ошибка.

person Scooter    schedule 18.01.2014
comment
К вашему сведению, если вы создаете сеанс с обработчиком завершения, методы делегата вызываться не будут. - person Hwangho Kim; 19.01.2016
comment
@HwanghoKim Большое спасибо! У меня был обработчик завершения, и методы делегата никогда не вызывались. Я сходил с ума! - person Luis Valdés; 15.03.2016
comment
@HwanghoKim, это НЕ правда, что методы делегата не будут вызываться, если вы создадите сеанс с обработчиком завершения. У меня так и работает отлично. Никакие документы не подтверждают ваше заявление. В вашем коде должно быть что-то еще неправильно, если методы не вызываются. - person Stephan; 23.03.2016
comment
stackoverflow.com/questions/22653182/ - person jungledev; 20.04.2016