首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在ios中捕获wkwebview中的重定向url

在ios中捕获wkwebview中的重定向url
EN

Stack Overflow用户
提问于 2017-08-10 04:12:04
回答 7查看 49.6K关注 0票数 44

在使用WKWebView时,如何捕获重定向url,就像网页在提交用户名、密码或其他数据时重定向到另一个页面一样。我需要捕获重定向的url。WKNavigationDelegate中有什么方法可以重写吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2017-08-10 04:14:14

使用此WKNavigationDelegate方法

代码语言:javascript
运行
复制
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)
    }

希望这能有所帮助

票数 44
EN

Stack Overflow用户

发布于 2017-09-22 01:11:25

(这回答了一个稍微笼统一些的问题,即如何在WKWebView中检测URL重定向,这是将我带到这个页面的搜索。)

短答案

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

更长的答案

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

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

  1. 对于原始的WKNavigationDelegate请求,调用webView(_:decidePolicyFor:decisionHandler:)函数。WKWebViewURL属性设置为原始URL。
  2. 对于原始的WKNavigationDelegate请求,调用webView(_:didStartProvisionalNavigation:)函数。WKWebViewURL属性设置为原始URL。
  3. WKWebViewURL属性由WebKit更新为重定向URL。(只有当您是观察该属性的键值时,您才会知道这一点。)
  4. 为重定向的webView(_:decidePolicyFor:decisionHandler:)请求调用webView(_:decidePolicyFor:decisionHandler:)函数。然后WKWebViewURL属性是重定向URL。
  5. 调用WKNavigationDelegate函数webView(_:didReceiveServerRedirectForProvisionalNavigation:)WKWebViewURL属性是重定向URL。

(注意:在iOS 11.0模拟器上,我看到步骤3和步骤4发生了逆转,URL属性在webView(_:decidePolicyFor:decisionHandler:)中保持不变,这似乎是一种合理的排序,但我还没有在设备上观察到这一点。)

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

票数 43
EN

Stack Overflow用户

发布于 2020-10-30 20:45:28

在尝试了所有的解决方案之后,这个解决方案最终适用于我使用Swift 5,而WKWebView.This解决方案实现了Swift的KVO

代码语言:javascript
运行
复制
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()
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45604336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档