2014-01-18 4 views
4

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

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

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

Линия кода [getFileTask resume], похоже, ни на что не влияет.

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

@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]; 
} 

методы делегата I внедрившие являются:

-(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); 
     } 

    } 
} 

Спасибо!

ответ

9

РЕШЕННЫЙ!

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

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

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

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

Он по-прежнему кажется странным мне что он просто не работает. Я бы ожидал появления всплывающего окна.

+0

Вы должны отметить свой ответ как правильный ответ. –

+6

FYI, если вы создаете сеанс с ** обработчиком завершения **, методы делегата не будут вызываться. –

+0

@HwanghoKim Большое вам спасибо! У меня был обработчик завершения, и методы делегата никогда не вызывались. Я сошел с ума! –

Смежные вопросы