2015-06-26 4 views
4

Я прочитал много сообщений о том, как я могу применить базовую аутентификацию.Обычная проверка подлинности с помощью UIWebView

Я создал этот код, но он не отображает страницу входа в систему, отображается только белая страница. Учетные данные, которые я использую , работает в браузере, так что это не проблема. Мои делегаты в порядке.

Я не могу понять, где мой код не:

override func viewDidLoad() { 
    super.viewDidLoad() 
    webView.delegate = self 
    self.loadPage() 
} 

func loadPage() { 
    let url = "mypage.com/auht/Logon.do" 
    let request = NSMutableURLRequest(URL: NSURL(string: url)!, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData, timeoutInterval: 12) 
    webView.loadRequest(request) 
} 

// MARK: NSURLConnectionDelegate Delegates 

func connection(connection: NSURLConnection, willSendRequestForAuthenticationChallenge challenge: NSURLAuthenticationChallenge) { 
    if challenge.previousFailureCount == 0 { 
     authenticated = true 
     let credential = NSURLCredential(user: "m.rinaldi13", password: "299792,458km/s", persistence: NSURLCredentialPersistence.ForSession) 
     challenge.sender.useCredential(credential, forAuthenticationChallenge: challenge) 
    } else { 
     challenge.sender.cancelAuthenticationChallenge(challenge) 
    } 
} 

// MARK: Web View Delegates 

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool { 
    if authenticated == nil { 
     authenticated = false 
     NSURLConnection(request: request, delegate: self) 
     return false 
    } 
    return true 
} 

Любая помощь/наконечник будет оценен по достоинству!

ответ

2

Я нахожу решение самостоятельно, исключая все эти скучные пасеки.

func doRequestWithBasicAuth(completion : (success : Bool, html: String?, error : NSError?) -> Void) { 
    if let user = self.user { 
     let loginString = NSString(format: "%@:%@", user.login!, user.pwd!) 
     let loginData: NSData = loginString.dataUsingEncoding(NSUTF8StringEncoding)! 
     let base64LoginString = loginData.base64EncodedStringWithOptions(nil) 
     let url = NSURL(string: user.service!.getURL()) 
     let request = NSMutableURLRequest(URL: url!) 
     request.HTTPMethod = "POST" 
     request.setValue("Basic \(base64LoginString)", forHTTPHeaderField: "Authorization") 
     NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {(response, data, error) in 
      if error == nil { 
       let htmlString = NSString(data: data, encoding: NSUTF8StringEncoding) 
       completion(success: true, html: htmlString as? String, error: nil) 
      } else { 
       completion(success: false, html: nil, error: error) 
      } 
     } 
    } else { 
     completion(success: false, html: nil, error: NSError()) 
    } 
} 

Затем вы можете равномерно отобразить страницу на веб-просмотра таким образом:

self.doRequestWithBasicAuth({ (success, html, error) -> Void in 
    if error == nil { 
     self.webView.loadHTMLString(string: html, baseURL: <yourNSURL>) 
    } 
}) 

Очевидно, что вы можете (у), чтобы украсить код, как создать класс для модели пользователя:

class User { 
    var login: String? 
    var pwd: String? 

    func valueForHeaderFieldAuthorization() -> String { 
     let loginString = NSString(format: "%@:%@", user.login!, user.pwd!) 
     let loginData: NSData = loginString.dataUsingEncoding(NSUTF8StringEncoding)! 
     let base64LoginString = loginData.base64EncodedStringWithOptions(nil) 
     return "Basic \(base64LoginString)" 
    } 
} 
Смежные вопросы