如何从 WKWbView 完成加载中获取标题

Posted

技术标签:

【中文标题】如何从 WKWbView 完成加载中获取标题【英文标题】:How to get headers from WKWbView finish loads 【发布时间】:2021-07-16 04:55:32 【问题描述】:

我在应用程序中使用 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 我在这里解决了问题***.com/questions/68403684/… 【参考方案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 你想做什么?这完全取决于您如何决定要允许或不允许哪些导航***.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)”、“接受”: "文本/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 我已经发布了新的推荐人问题。***.com/questions/68404439/…

以上是关于如何从 WKWbView 完成加载中获取标题的主要内容,如果未能解决你的问题,请参考以下文章

如何从 iframe 中获取内容类型?

如何从对象检测数据加载器中的马赛克增强中获取类标签?

Next.js + Redux:在 getInitialProps 中获取数据操作完成之前加载一个页面

从 Firebase 完成加载后如何使 UIRefreshControl 结束刷新

如何从托管 bean 中获取消息包字符串?

如何从多个加载的模型中获取选定的模型?