2016-05-12 17 views
8

W mojej aplikacji na iOS, chciałbym użyć WKWebView do zawijania zewnętrznego adresu URL w aplikacji. Ten adres URL wymaga podstawowego uwierzytelnienia (wymaga poświadczenia użytkownika i hasła, jak na poniższym zrzucie ekranu).Uwierzytelnianie za pomocą WKWebView w Swift

enter image description here

Po pewnym dochodzenia, Próbuję użyć didReceiveAuthenticationChallenge sposób, aby umożliwić automatyczne logowanie, więc nie mam zrozumienia, jak to działa.

To jest mój kod.

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

jestem stoi z tego wyjątku:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Completion handler passed to -[MyUnimol.WebViewController webView:didReceiveAuthenticationChallenge:completionHandler:] was not called'

Jeśli usunę metodę didReceiveAuthenticationChallenge, jestem w stanie dotrzeć do adresu URL, ale to daje mi, obliviously, błędne dane uwierzytelniające.

Ktoś może mi wyjaśnić, co robię źle, proszę?

Odpowiedz

11

Dodaj następujący wiersz:

completionHandler(NSURLSessionAuthChallengeDisposition.UseCredential, credential) 

na koniec didReceiveAuthenticationChallenge rozwiązało problem.

Powiązane problemy