Authentication with WKWebView in Swift
In a simpler way:
Though this answer looks redundant but posting as this may help other naive developers (like me).
func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
guard (webView.url?.host) != nil else {
return
}
let authenticationMethod = challenge.protectionSpace.authenticationMethod
if authenticationMethod == NSURLAuthenticationMethodDefault || authenticationMethod == NSURLAuthenticationMethodHTTPBasic || authenticationMethod == NSURLAuthenticationMethodHTTPDigest {
let credential = URLCredential(user: userName, password: password, persistence: .none)
completionHandler(.useCredential, credential)
} else if authenticationMethod == NSURLAuthenticationMethodServerTrust {
completionHandler(.performDefaultHandling, nil)
} else {
completionHandler(.cancelAuthenticationChallenge, nil)
}
}
Add the following line:
completionHandler(NSURLSessionAuthChallengeDisposition.UseCredential, credential)
at the end of didReceiveAuthenticationChallenge
solved the problem.
i am late to party but still this can be useful for someone.
To support auth challenge in WKWebview Swift 4, complete code as below
func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
guard let hostname = webView.url?.host else {
return
}
let authenticationMethod = challenge.protectionSpace.authenticationMethod
if authenticationMethod == NSURLAuthenticationMethodDefault || authenticationMethod == NSURLAuthenticationMethodHTTPBasic || authenticationMethod == NSURLAuthenticationMethodHTTPDigest {
let av = UIAlertController(title: webView.title, message: String(format: "AUTH_CHALLENGE_REQUIRE_PASSWORD".localized, hostname), preferredStyle: .alert)
av.addTextField(configurationHandler: { (textField) in
textField.placeholder = "USER_ID".localized
})
av.addTextField(configurationHandler: { (textField) in
textField.placeholder = "PASSWORD".localized
textField.isSecureTextEntry = true
})
av.addAction(UIAlertAction(title: "BUTTON_OK".localized, style: .default, handler: { (action) in
guard let userId = av.textFields?.first?.text else{
return
}
guard let password = av.textFields?.last?.text else {
return
}
let credential = URLCredential(user: userId, password: password, persistence: .none)
completionHandler(.useCredential,credential)
}))
av.addAction(UIAlertAction(title: "BUTTON_CANCEL".localized, style: .cancel, handler: { _ in
completionHandler(.cancelAuthenticationChallenge, nil);
}))
self.parentViewController?.present(av, animated: true, completion: nil)
}else if authenticationMethod == NSURLAuthenticationMethodServerTrust{
// needs this handling on iOS 9
completionHandler(.performDefaultHandling, nil);
}else{
completionHandler(.cancelAuthenticationChallenge, nil);
}
}