URLSession didReceiveChallenge слишком медленный

Выполнение моего приложения обычно останавливается на 2-3 секунды (даже 5 секунд) в didReceiveChallenge. Примерно в 1 раз из 10 это занимает вечность. Все это работает, но что я могу сделать, чтобы ускорить его?

Вот мой код:

- (void)URLSession:(NSURLSession *)session
didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
 completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * __nullable credential))completionHandler{
    NSLog(@"*** KBRequest.NSURLSessionDelegate - didReceiveChallenge IOS10");
    if([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]){
        if([challenge.protectionSpace.host isEqualToString:@"engine.my.server"]){
            NSURLCredential *credential = [NSURLCredential credentialForTrust: challenge.protectionSpace.serverTrust];
            completionHandler(NSURLSessionAuthChallengeUseCredential,credential);
        }
        else{
            completionHandler(NSURLSessionAuthChallengeCancelAuthenticationChallenge, nil);
        }
    }
}

1 ответ

Вы ДОЛЖНЫ вызывать обработчик завершения КАЖДЫЙ раз, когда вызывается этот метод. Вы только называете это для единственного пространства защиты.

Когда ОС вызывает этот метод на вашем делегате, NSURLSession стек сидит там покорно, ожидая, пока вы вызовете блок обработчика завершения. Если вам не удастся вызвать обработчик завершения, ваш запрос будет находиться в подвешенном состоянии до истечения времени ожидания запроса.

Чтобы это исправить, в нижней части метода добавьте:

} else {
    completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, nil);
}
Другие вопросы по тегам