2016-12-04 4 views
1

Ich versuche, ein einfaches WebView zu erstellen, das eine Webseite zeigt - die Seite erfordert http-Authentifizierung für alle Seiten (zu Testzwecken).swift 3 - http-Authentifizierung in WKWebView

Hier ist mein Code:

class ViewController: UIViewController, WKUIDelegate { 

    var webView: WKWebView! 

    override func loadView() { 
     let webConfiguration = WKWebViewConfiguration() 
     webView = WKWebView(frame: .zero, configuration: webConfiguration) 
     webView.uiDelegate = self 
     view = webView 
    } 

    // #1 variant 
    func webView(webView: WKWebView, willSendRequestForAuthenticationChallenge challenge: 
     URLAuthenticationChallenge, completionHandler: (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { 
     let user = "user" 
     let password = "pass" 
     let credential = URLCredential(user: user, password: password, persistence: URLCredential.Persistence.forSession) 
     challenge.sender?.use(credential, for: challenge) 
    } 

    // #2 variant 
    func webView(webView: WKWebView, didReceiveAuthenticationChallenge challenge: URLAuthenticationChallenge, completionHandler: (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { 

      let user = "user" 
      let password = "pass" 
      let credential = URLCredential(user: user, password: password, persistence: URLCredential.Persistence.forSession) 
      challenge.sender?.use(credential, for: challenge) 

    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let myURL = URL(string: "https://myurl.com") 
     let myRequest = URLRequest(url: myURL!) 
     webView.load(myRequest) 
    } 

} 

I willSendRequestForAuthenticationChallenge und didReceiveAuthenticationChallenge gefunden haben, aber keiner von ihnen genannt wird, und ich habe von der Server-Fehler, die ich nicht authentifiziert wurde.

Könnte jemand helfen?

Vielen Dank!

David

+0

Fest Variante # 1 durch den Zusatz "_": func webView (_ webView: WKWebView, didReceive Herausforderung: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { Lassen Sie Benutzer = "Benutzer" lassen Sie password = "pass" let Credential = URLCredential (Benutzer: Benutzer, Passwort: Passwort, Persistenz: URLCredential.Persistence.forSession) challenge.sender .use (Berechtigungsnachweis, für: challenge)? completionHandler (URLSession.AuthChallengeDisposition.useCredential, Berechtigungsnachweis) } – David

+0

Wollten Sie WKUIDelegate verwenden? Ich habe meine View-Controller-Klasse mit WKNavigationDelegate erweitert (Einstellung von webView.navigationDelegate = self anstelle von webView.uiDelegate = self) und die folgende Funktion implementiert: func webView (_webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition , URLCredential?) -> Void) { – CScott

+0

ja, ich teilte die Antwort bereits unter – David

Antwort

1

Feste Variante # 1 durch den Zusatz "_":

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

     let user = "user" 
     let password = "pass" 
     let credential = URLCredential(user: user, password: password, persistence: URLCredential.Persistence.forSession) 
     challenge.sender?.use(credential, for: challenge) 
     completionHandler(URLSession.AuthChallengeDisposition.useCredential, credential) 
} 
0

Es funktioniert durch Entfernen (oder kommentieren Sie) diese Zeile. challenge.sender?.use(credential, for: challenge) Ich habe es auch in anderen iOS-Versionen 9.X, 10.1, 10.2 und 10.3 überprüft. Es funktioniert gut.

func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) { 
    let user = "user" 
    let password = "pass" 
    let credential = URLCredential(user: user, password: password, persistence: URLCredential.Persistence.forSession) 
    completionHandler(URLSession.AuthChallengeDisposition.useCredential, credential) 

}

0

ich eine UIViewController mit WKWebView gemacht haben, der die Authentifizierung verwalten, können Sie installieren mit CocoaPod