如何从 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】:
使用WKWebView
的webView(_: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 完成加载中获取标题的主要内容,如果未能解决你的问题,请参考以下文章
Next.js + Redux:在 getInitialProps 中获取数据操作完成之前加载一个页面