2017-05-13 2 views
1

Ich verwende AF und verwende den Delegaten, um die von meinem Server zurückgegebene Authentifizierungsanforderung zu erfassen.Problem mit Alamofire-Challenge-Delegat und Escaping-Closure

func connectGetRequest(_ url : URL){ 

    let sessionManager = Alamofire.SessionManager.default 
    sessionManager.request(url).responseString { response in 
     print("Response String: \(response.result.value)") 
    } 
    let delegate: Alamofire.SessionDelegate = sessionManager.delegate 


    delegate.taskDidReceiveChallengeWithCompletion = { session, task, challenge, completionHander in 
     print("session is \(session), task is \(task) challenge is \(challenge.protectionSpace.authenticationMethod) and handler is \(completionHander)") 
     if(challenge.protectionSpace.authenticationMethod == "NSURLAuthenticationMethodServerTrust"){ 

      completionHander(.performDefaultHandling,nil) 
     }else{ 

      print("challenge type is \(challenge.protectionSpace.authenticationMethod)") 

     // Following line give me the error: "passing non-escaping parameter 'completionHander' to function expecting an @escaping closure" 

self.handleAuthenticationforSession(challenge,completionHandler: completionHander) 
     } 
    } 

    delegate.dataTaskDidReceiveData = {session , task, data in 

     print("received data \(data)") 
    } 

} 


func handleAuthenticationforSession(_ challenge: URLAuthenticationChallenge,completionHandler: @escaping (Foundation.URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { 


     Authhandler.handleChallenge(forURLSessionChallenge: challenge, completionHandler: completionHandler) 


} 

Problem habe ich:

  1. Wenn ich den Code verwenden, oben, wie es ist, ich

    Fehler: „Passing nicht entkommen Parameter 'completionHander' ein erwartet funktionieren @ escaping closure "

  2. Wenn ich den Parameter der Funktion handleAuthenticationSession nicht entkommen lassen, bekomme ich:

    func handleAuthenticationforSession(_ challenge: URLAuthenticationChallenge, 
        completionHandler: (Foundation.URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { 
    
        } 
    

Fehler: „Closure Verwendung von nicht-entweichenden Parameter‚Vollendung‘erlauben kann es zu entkommen“

Auch handleChallenge Methode aus AuthHandler Klasse sieht (die ein Teil der obj-c Rahmen ist) wie folgt.

Also im Grunde bin ich in einem Deadlock fest, während ich Alamofire's Closure-Syntax verwende, um die Auth-Challenge zu delegieren.

Antwort

1

Es scheint mir der fehlende Teil Ihrer Frage ist, ob der Abschluss-Handler in Authhandler.handleChallenge entkommen ist. Es ist richtig?

Aber die taskDidReceiveChallengeWithCompletion CompletionHandler ist nicht entkommen. Also versuchst du herauszufinden, wie du es entkommen lassen kannst, wenn es nicht erlaubt ist zu entkommen.

Mit Blick auf den Alamofire-Quellcode, vor etwa 3 Monaten, änderten sie diese FertigstellungHandler zu @escaping! Siehe hier: https://github.com/Alamofire/Alamofire/commit/b03b43cc381ec02eb9855085427186ef89055eef

Sie müssen auf eine Version von Alamofire aktualisieren, nachdem der PR zusammengeführt wurde oder Sie herausfinden müssen, wie Sie mit dem completionHandler auf vollständig nicht-flüchtige Weise umgehen können. Das heißt, Ihre Authhandler.handleChallenge kann keinen Escaped-Abschluss-Handler haben.