2017-03-14 1 views
1

L'exécution de mon application s'arrête généralement pendant 2-3 secondes (même 5 secondes) à didReceiveChallenge. Environ 1 fois sur 10, cela prend une éternité. Le tout fonctionne, mais que puis-je faire pour l'accélérer?URLSession didReceiveChallenge est trop lent

Voici mon code:

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

Répondre

0

Vous devez appeler le gestionnaire d'achèvement Chaque fois que cette méthode est appelée. Vous ne l'appelez que pour un seul espace de protection.

Lorsque le système d'exploitation appelle cette méthode sur votre délégué, la pile NSURLSession attend que vous appeliez le bloc du gestionnaire d'achèvement. Si vous ne parvenez pas à appeler le gestionnaire de complétion, votre demande restera dans les limbes jusqu'à expiration de la requête.

Pour résoudre ce problème, au fond de la méthode, ajouter:

} else { 
    completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, nil); 
}