【问题标题】:Capture redirect url in wkwebview in ios在 ios 的 wkwebview 中捕获重定向 url
【发布时间】:2018-01-18 03:35:21
【问题描述】:

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

【问题讨论】:

  • 你好昨天你的问题解决了还是没有
  • 使用 wkwebview 解决了
  • 好,但你没有通知我

标签: ios objective-c swift uiwebview wkwebview


【解决方案1】:

使用这个WKNavigationDelegate 方法

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

希望对你有帮助

【讨论】:

  • 它现在不再工作 navigationAction.navigationType => .other 用于重定向
  • @sheshnath 谢谢,我会查看并更新我的答案
  • @ShauketSheikh 16/08/2018
  • 好的@ShauketSheikh我会再次审查它,无论如何检查另一个答案也许可以帮助你,让我知道
  • 谢谢,但我正面临 wkwebview ios 9 的非常奇怪的问题??? cookie 没有为重定向 uri 更新
【解决方案2】:

(这回答了关于如何在 WKWebView 中检测 URL 重定向的稍微更一般的问题,这是引导我进入此页面的搜索。)

简答

使用WKNavigationDelegatewebView(_:didReceiveServerRedirectForProvisionalNavigation:) 函数并检查WKWebViewURL 属性。

更长的答案

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

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

  1. WKNavigationDelegate 函数 webView(_:decidePolicyFor:decisionHandler:) 被称为 原始 URL 请求。 WKWebViewURL 属性设置为 原始网址。

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

  3. WKWebViewURL 属性由 WebKit 更新为重定向 URL。 (只有当你是键值时你才会知道这一点 观察属性。)

  4. 调用WKNavigationDelegate 函数webView(_:decidePolicyFor:decisionHandler:) 重定向的 URL 请求。 WKWebViewURL 属性是然后 重定向网址。

  5. WKNavigationDelegate 函数 webView(_:didReceiveServerRedirectForProvisionalNavigation:) 是 叫。 WKWebViewURL 属性是 重定向网址。

(注意:在 iOS 11.0 模拟器上,我看到第 3 步和第 4 步颠倒了,webView(_:decidePolicyFor:decisionHandler:) 中的URL 属性未更改,这实际上似乎是一个明智的排序,但我没有在设备上观察到这一点.)

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

【讨论】:

    【解决方案3】:

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

    var webView: WKWebView?
    var webViewObserver: NSKeyValueObservation?
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        webView = WKWebView(frame: self.view.bounds)
        webViewObserver = webView?.observe(\.url, options: .new, changeHandler: {
            (currentWebView, _) in
            //      Here you go the new path
            currentWebView.url
        })
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        webViewObserver?.invalidate()
    }
    

    【讨论】:

      【解决方案4】:

      Swift 5 轰隆隆

      很简单的方法

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

      【讨论】:

        【解决方案5】:

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

        因为WKNavigationDelegate的方法没用

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

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

        首先,在viewDidLoad中添加:

        webView.addObserver(self, forKeyPath: "URL", options: .new, context: nil)
        

        其次,添加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
                }
            }
        

        【讨论】:

        • 很有趣,但是我能得到一份关于这个的文件吗?
        【解决方案6】:

        感谢 Sven: https://forums.developer.apple.com/thread/117073

        如果您遇到 WebView 无法打开 PDF 文件或只是 url 解析为空的情况,因为 WebView 的重定向 URL 没有通过,您可以使用 WKUIDelegate 函数 webView(_:createWebViewWith:for:windowFeatures:) 来捕获调用失败并再次加载请求,例如:

        extension WebViewWrapper: WKUIDelegate {
        
         func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
             if navigationAction.targetFrame == nil || navigationAction.targetFrame?.isMainFrame == false {
                 webView.load(navigationAction.request)
             }
             return nil
         }
        

        }

        【讨论】:

          【解决方案7】:

          使用这个 WKNavigationDelegate 方法。我从 sourceFrame.request 获得了重定向 url

          public func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Swift.Void) {
                  let urlString = navigationAction.sourceFrame.request.url?.absoluteString ?? ""
                  print("\(urlString)")
                  decisionHandler(.allow)
           }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-03-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-03-22
            相关资源
            最近更新 更多