【问题标题】:How to get headers from WKWbView finish loads如何从 WKWebView 获取标题完成加载
【发布时间】:2021-09-24 22:34:35
【问题描述】:

我在应用程序中使用 WKWebView 并且我正在寻找从 wkwebview 中获取所有标题的完成加载方法 webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { 就像在 UIWebView 中一样

func webViewDidFinishLoad(_ webView: UIWebView) {
        print("Finished loads---", webView.request?.allHTTPHeaderFields)
    }

我们如何在WKWebView 中实现这一点?

【问题讨论】:

  • 那么问题是什么?
  • 我没有在webView(_ webView: WKWebView, didFinish navigation: WKNavigation!@ElTomato 中获得标题
  • @ElTomato 在webView(_ webView: WKWebView, didFinish navigation: WKNavigation! 代码webView.request?.allHTTPHeaderFields 不起作用。你能帮忙吗?
  • 我不认为你可以使用 didFinish。
  • @ElTomato 我在这里解决了问题stackoverflow.com/questions/68403684/…

标签: ios swift uiwebview wkwebview wkwebviewconfiguration


【解决方案1】:

您需要将您的视图控制器设置为 WKWebView Navigation Delegate WKNavigationDelegate 并实现其 decidePolicyFor 方法:

optional func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)

试试这样:


func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    let allHTTPHeaderFields = navigationAction.request.allHTTPHeaderFields ?? [:]
    for (key, value) in allHTTPHeaderFields {
        print("key:", key, "value:", value)
    }
    
    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)
    }
}

【讨论】:

  • 不设置decisionHandler(.allow)decisionHandler(.cancel),应用程序不会崩溃吗?
  • @LeoDabus @ElTomato 谢谢但是。如果 URL 有多个重定向,那么它不会在 decidePolicyFor navigationAction 中捕获它只显示第一个 URL
  • @Amit 你想做什么?这完全取决于您如何决定要允许或不允许哪些导航stackoverflow.com/a/36231713/2303865
  • @LeoDabus。不知何故,我们需要在func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) 中进行管理,它会调用每个重定向,以便我们可以确认每个重定向标头都正确嵌入。 :) 这就是我要找的
  • @Amit 不确定你在问什么。在您的问题中,您询问了如何仅在完成加载 Web 视图时获取标题。这是你想要达到的目标吗?
【解决方案2】:

使用WKWebViewwebView(_:decidePolicyFor:decisionHandler:)

import UIKit
import WebKit

class ViewController: UIViewController, WKNavigationDelegate {
    // MARK: - IBOutlet
    @IBOutlet weak var webView: WKWebView!
    
    
    // MARK: - Life cycle
    override func viewDidLoad() {
        super.viewDidLoad()
        webView.navigationDelegate = self
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        let urlStr = "https://www.google.com/"
        if let url = URL(string: urlStr) {
            let request = URLRequest(url: url)
            webView.load(request)
            //webView.allowsBackForwardNavigationGestures = false
            //webView.navigationDelegate = self
        }
    }
    
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        let request = navigationAction.request
        if let host = navigationAction.request.url?.host {
            if host == "www.google.com" {
                if let headers = request.allHTTPHeaderFields {
                    print("Google Headers: \(headers)")
                } else {
                    print("Nope, sir")
                }
            }
            else if host == "www.apple.com" {
                if let headers = request.allHTTPHeaderFields {
                    print("Apple Headers: \(headers)")
                } else {
                    print("Nope, sir")
                }
            }
        }
        decisionHandler(.allow)
    }
}

我得到以下信息。

["User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_4 like Mac OS X) AppleWebKit/605.1.15(KHTML,如 Gecko)”、“接受”: "text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8"] 标题:[“Accept-Language”:“en-us”,“Upgrade-Insecure-Requests”: "1", "Accept-Encoding": "gzip, deflate, br", "User-Agent": “Mozilla/5.0(iPhone;CPU iPhone OS 14_4 像 Mac OS X) AppleWebKit/605.1.15(KHTML,如 Gecko)”、“接受”: "text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8"]

【讨论】:

  • 领先你 30 秒 :)
  • 是的,先生。
  • 不用担心 :) 两位传奇人物的好答案 :)
  • @ElTomato 我在另一个答案上添加了 cmets,请帮忙。
  • @ElTomato 我已经发布了新的推荐人问题。stackoverflow.com/questions/68404439/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多