具有基本身份验证的WKWebView

时间:2020-03-03 13:15:14

标签: ios authentication wkwebview swift5 xcode11

我正在尝试创建一个使用WebView嵌入网站的简单应用程序,一切正常,除了我不知道如何针对需要凭据的网站进行身份验证。 我在网上搜索了几个小时,最后放弃了寻找答案的机会。可能只是因为我不知道使用什么措辞。 希望这里的任何人都知道一种对凭据进行硬编码的方法,或者最好是一种让用户输入自己的凭据的方法。

谢谢!

我正在使用的代码是最简单的,如下所示:

import SwiftUI
import WebKit

struct ContentView: View {
    var body: some View {
        NavigationView {
            VStack {
                WebView(request: URLRequest(url: URL(string: "https://siteurl")!))
            }.navigationBarTitle("Example Text")
        }
    }
}

struct WebView: UIViewRepresentable {
    let request: URLRequest

    func makeUIView(context: Context) -> WKWebView {
        return WKWebView()
    }

    func updateUIView(_ uiView: WKWebView, context: Context) {
        uiView.load(request)
    }
}

2 个答案:

答案 0 :(得分:2)

您可以使用webView(_:didReceive:completionHandler:)中的WKNavigationDelegate回调。从那里您可以输入凭据并通过网页进行身份验证。

您可以像以下(伪代码)一样实现它:

struct WebView: UIViewRepresentable, WKNavigationDelegate {
    func makeUIView(context: Context) -> WKWebView {
        let webView = WKWebView()
        webView.navigationDelegate = self
        return webView
    }

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

在此处了解更多信息

https://developer.apple.com/documentation/webkit/wknavigationdelegate/1455638-webview

答案 1 :(得分:0)

WKNavigationDelegate必须是类,而不是结构。覆盖makeCoordinator()中的UIViewRepresentable,将WKWebView绑定到WKNavigationDelegate。参见this sample code