在我的iOS应用程序中,我想使用WKWebView在应用程序中包装外部URL 。此URL需要基本身份验证(它需要用户和密码凭据,如以下屏幕截图所示)。
经过一番调查,我尝试使用 didReceiveAuthenticationChallengemethod来启用自动 登录,因此我不了解它的工作原理。
这是我的代码。
import UIKit import WebKit class WebViewController: UIViewController, WKNavigationDelegate { var webView: WKWebView? private var request : NSURLRequest { let baseUrl = "https://unimol.esse3.cineca.it/auth/Logon.do" let URL = NSURL(string: baseUrl)! return NSURLRequest(URL: URL) } /* Start the network activity indicator when the web view is loading */ func webView(webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation){ UIApplication.sharedApplication().networkActivityIndicatorVisible = true } /* Stop the network activity indicator when the loading finishes */ func webView(webView: WKWebView, didFinishNavigation navigation: WKNavigation){ UIApplication.sharedApplication().networkActivityIndicatorVisible = false } func webView(webView: WKWebView, decidePolicyForNavigationResponse navigationResponse: WKNavigationResponse, decisionHandler: ((WKNavigationResponsePolicy) -> Void)){ decisionHandler(.Allow) } func webView(webView: WKWebView, didReceiveAuthenticationChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void) { if challenge.protectionSpace.host == "https://unimol.esse3.cineca.it/auth/Logon.do" { let user = "*******" let password = "******" let credential = NSURLCredential(user: user, password: password, persistence: NSURLCredentialPersistence.ForSession) challenge.sender?.useCredential(credential, forAuthenticationChallenge: challenge) } } override func viewDidLoad() { /* Create our preferences on how the web page should be loaded */ let preferences = WKPreferences() preferences.javaScriptEnabled = false /* Create a configuration for our preferences */ let configuration = WKWebViewConfiguration() configuration.preferences = preferences /* Now instantiate the web view */ webView = WKWebView(frame: view.bounds, configuration: configuration) if let theWebView = webView { /* Load a web page into our web view */ let urlRequest = self.request theWebView.loadRequest(urlRequest) theWebView.navigationDelegate = self view.addSubview(theWebView) } } }
I’m facing with this exception:
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Completion handler passed to -[MyUnimol.WebViewController webView:didReceiveAuthenticationChallenge:completionHandler:] was not called'
If I delete the didReceiveAuthenticationChallenge method, I’m able to reach the URL but is gives me, obliviously, wrong credentials.
didReceiveAuthenticationChallenge
Anyone could explain me what I’m doing wrong please?
添加以下行:
completionHandler(NSURLSessionAuthChallengeDisposition.UseCredential, credential)
at the end of didReceiveAuthenticationChallenge solved the problem.