在ios中的wkwebview中捕获重定向URL

Pra*_*Raj 22 objective-c uiwebview ios swift wkwebview

如何在使用WKWebView时捕获重定向URL,就像在提交用户名和密码或其他数据时网页重定向到另一个页面一样.我需要捕获重定向的URL.WKNavigationDelegate中有任何方法可以覆盖吗?

Rei*_*ian 21

使用此WKNavigationDelegate方法

public func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Swift.Void)
    {
        if(navigationAction.navigationType == .other)
        {
            if navigationAction.request.url != nil
            {
                //do what you need with url
                //self.delegate?.openURL(url: navigationAction.request.url!)
            }
            decisionHandler(.cancel)
            return
        }
        decisionHandler(.allow)
    }
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助

  • 它现在不再工作了navigationAction.navigationType => .other用于重定向 (2认同)

use*_*021 20

(这回答了如何在WKWebView中检测URL重定向的更一般的问题,这是引导我访问此页面的搜索.)

简短的回答

使用WKNavigationDelegatewebView(_:didReceiveServerRedirectForProvisionalNavigation:)功能和检查WKWebViewURL属性.

更长的答案

有几个地方可以检测到服务器端重定向.

在iOS 10.3.3和iOS 11.0上,我在加载由服务器重定向的URL时观察到的事件序列是:

  1. 为原始URL请求调用该WKNavigationDelegate函数 webView(_:decidePolicyFor:decisionHandler:).WKWebViewURL属性设置为原始URL.

  2. 为原始URL请求调用该WKNavigationDelegate函数webView(_:didStartProvisionalNavigation:).WKWebViewURL属性设置为原始URL.

  3. WKWebViewURL属性由WebKit的对重定向URL更新.(如果你是观察财产的关键值,你只会知道这一点.)

  4. 为重定向的URL请求调用该WKNavigationDelegate函数webView(_:decidePolicyFor:decisionHandler:).WKWebViewURL属性是重定向URL.

  5. WKNavigationDelegate函数webView(_:didReceiveServerRedirectForProvisionalNavigation:)被调用.WKWebViewURL属性是重定向URL.

(注意:在iOS 11.0模拟器上,我看到第3步和第4步颠倒了,URL属性保持不变webView(_:decidePolicyFor:decisionHandler:),实际上看起来像是一种合理的排序,但我没有在设备上观察到这一点.)

似乎webView(_:didReceiveServerRedirectForProvisionalNavigation:)是为了检测重定向而明确构建的,因此可能是首选选项,尽管可能可以在步骤3或4中推断重定向,但前提是您可以确定没有其他导航更改的原因.


小智 10

在尝试了所有解决方案之后,最后这个解决方案对我使用 Swift 5 和 WKWebView 有效。该解决方案为 Swift 实现了 KVO

\n
var webView: WKWebView?\nvar webViewObserver: NSKeyValueObservation?\n\noverride func viewDidAppear(_ animated: Bool) {\n    super.viewDidAppear(animated)\n    webView = WKWebView(frame: self.view.bounds)\n    webViewObserver = webView?.observe(\\.url, options: .new, changeHandler: {\n        (currentWebView, _) in\n        //\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0Here you go the new path\n        currentWebView.url\n    })\n}\n\noverride func viewWillDisappear(_ animated: Bool) {\n    super.viewWillDisappear(animated)\n    webViewObserver?.invalidate()\n}\n
Run Code Online (Sandbox Code Playgroud)\n


Sha*_*med 7

雨燕 5 繁荣

非常简单的方法

func webView(_ webView: WKWebView, didReceiveServerRedirectForProvisionalNavigation navigation: WKNavigation!) {
    if let url = webView.url?.absoluteString{
        print("url = \(url)")
    }
}
Run Code Online (Sandbox Code Playgroud)


JPe*_*ric 5

对我来说,使用decidePolicyFor导航委托的方法不起作用

它不起作用,因为 WKNavigationDelegate 的方法

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)
Run Code Online (Sandbox Code Playgroud)

仅在全页重新加载时才会被调用。为了能够捕获所有 WKWebView 的请求 URL 更改,必须在 WKWebView 的 URL 属性上放置一个键值观察器。

首先,在viewDidLoad中添加:

webView.addObserver(self, forKeyPath: "URL", options: .new, context: nil)
Run Code Online (Sandbox Code Playgroud)

、添加observeValue方法

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        if keyPath == #keyPath(WKWebView.url) {
            // Whenever URL changes, it can be accessed via WKWebView instance
            let url = webView.url
        }
    }
Run Code Online (Sandbox Code Playgroud)