Я создал очень простое приложение для загрузки текстового файла с моего веб-сервера. Я отлично работаю с 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);
}
}
}
Спасибо!
Вы должны отметить свой ответ как правильный ответ. –
FYI, если вы создаете сеанс с ** обработчиком завершения **, методы делегата не будут вызываться. –
@HwanghoKim Большое вам спасибо! У меня был обработчик завершения, и методы делегата никогда не вызывались. Я сошел с ума! –