Я работаю над приложением iOS, которое подключается к веб-API ASP.NET через службы Restful. Я хочу использовать пользовательский делегат для выполнения проверки подлинности. Но метод делегата не вызван.Метод вызова аутентификации не вызывается при использовании пользовательского делегата NSURLSession
запрос HTTP записывается в следующем способе в контроллере представления:
- (IBAction)test:(UIButton *)sender
{
//Get Bearer Token
KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"BearerToken" accessGroup:nil];
NSString *bearerToken = [keychainItem objectForKey:(__bridge id)(kSecValueData)];
//Configure request
NSURL *url = [NSURL URLWithString:@"......"]; //Replace the .... with real IP Address
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"GET"];
[request setValue:[NSString stringWithFormat:@"Bearer %@", bearerToken] forHTTPHeaderField:@"Authorization"];
//Configure session
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AuthChallengeDelegate *authChallengeDel = [[AuthChallengeDelegate alloc] init];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration
delegate:authChallengeDel
delegateQueue:nil];
NSURLSessionDataTask *task = [session dataTaskWithRequest:request];
[task resume];
}
В классе AuthChallengeDelegate я реализовал следующий метод:
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler
{
NSLog(@"%@", response);
}
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition,
NSURLCredential *credential))completionHandler
{
NSLog(@"did receive challenge method called");
NSLog(@"%@", challenge.protectionSpace.authenticationMethod);
}
Первый метод (didReceiveResponse) вызывается, а код состояния ответа - 401 с «Www-Authenticate» = Bearer в поле заголовка. Но второй метод (didReceiveChallenge) не вызывается. Кто-нибудь здесь может дать мне представление о том, почему это не называется?
(я использую Xcode 6 и моделирования в iOS8)
Спасибо.
Возможно, вам нужно реализовать делегат * задачи * для задачи/ответа, то есть [URLSession (_: task: didReceiveChallenge: completeHandler:)] (https://developer.apple.com /library/IOs/documentation/Foundation/Reference/NSURLSessionTaskDelegate_protocol/index.html#//apple_ref/occ/intfm/NSURLSessionTaskDelegate/URLSession:task:didReceiveChallenge :completionHandler :), а также делегат уровня сеанса. (Метод делегата, который вы в настоящее время реализуете, обрабатывает проблемы на уровне сеанса/сервера, версия NSURLSessionTaskDelegate обрабатывает задачи на уровне задач.) –
Вы сделали эту работу? У меня такая же проблема. – Vannens
Привет, Ванненс, я не работал. Но я обнаружил, что моя серверная сторона не выдала вызов. На данный момент я не уверен в стороне iOS. – Dean