wkwebview中的拦截链接

时间:2020-10-18 05:52:49

标签: swift swiftui

我有这个网络视图:

import SwiftUI
import WebKit

struct ContentView: View {
    var body: some View {
        Webview(url: URL(string: "https://google.com")!)
    }
}

struct Webview: UIViewRepresentable {
    let url: URL

    func makeUIView(context: UIViewRepresentableContext<Webview>) -> WKWebView {
        let webview = WKWebView()

        let request = URLRequest(url: self.url, cachePolicy: .returnCacheDataElseLoad)
        webview.load(request)

        return webview
    }

    func updateUIView(_ webview: WKWebView, context: UIViewRepresentableContext<Webview>) {
        let request = URLRequest(url: self.url, cachePolicy: .returnCacheDataElseLoad)
        webview.load(request)
    }
}

当有人单击链接时,我该如何拦截?除了有人单击链接时转到URL之外,我还想做其他事情。我已经阅读了代表的内容,但它们只适用于较早的版本。

1 个答案:

答案 0 :(得分:0)

您可以实现一个Coordinator对象,并将其设置为WKNavigationDelegate。然后,您可以实现definePolicyFor navigationAction方法并确定对每个请求执行的操作:


import SwiftUI
import WebKit

struct ContentView: View {
    var body: some View {
        WebView(request: .init(url: URL(string: "https://google.com")!))
    }
}

struct WebView: UIViewRepresentable {
    let request: URLRequest
    func makeCoordinator() -> Coordinator { .init(self) }
    func makeUIView(context: Context) -> WKWebView  {
        let webView = WKWebView()
        webView.navigationDelegate = context.coordinator
        return webView
    }
    func updateUIView(_ webView: WKWebView, context: Context) {
        webView.load(request)
    }
    class Coordinator: NSObject, WKNavigationDelegate {
        var webView: WebView
        init(_ webView: WebView) { self.webView = webView }
        func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
            if navigationAction.navigationType == .linkActivated  {
                if let url = navigationAction.request.url,
                    let host = url.host, !host.hasPrefix("www.google.com"),
                    UIApplication.shared.canOpenURL(url) {
                    UIApplication.shared.open(url)
                    print(url)
                    print("Redirected to browser. No need to open it locally")
                    decisionHandler(.cancel)
                } else {
                    print("Open it locally")
                    decisionHandler(.allow)
                }
            } else {
                print("not a user click")
                decisionHandler(.allow)
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}