ios - WKWebView goBack 需要两次调用

标签 ios swift wkwebview

我正在开发一个使用 WKWebView 和自定义导航按钮的 iOS 应用程序。我们发现点击某些链接需要使用我们的后退按钮两次,因为第一次调用似乎只是重新加载当前页面。这不会发生在移动版 Safari 中。

是什么导致需要调用两次 goBack() 才能实际导航回一页,而它在 Safari 中可以正常工作?我可以在应用程序中进行更改以解决问题吗?

注意:我无法更改网站的内容或结构,因此任何修复都必须在应用程序中进行。

更新: 看来该网站正在使用 JavaScript 加载某些内容。发生这种情况时根本不会调用 observeValue 方法,这可能是罪魁祸首。

import UIKit
import WebKit
import SafariServices

class LandingPageViewController: UIViewController, SFSafariViewControllerDelegate, WKUIDelegate, WKNavigationDelegate {
    @IBOutlet var urlNavigationItem: UINavigationItem!    
    @IBOutlet var backButton: UIBarButtonItem!
    @IBOutlet var forwardButton: UIBarButtonItem!
    @IBOutlet var reloadButton: UIBarButtonItem!
    var webView: WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()
        webView = WKWebView()
        view.addSubview(webView)
        webView.addObserver(self, forKeyPath: "loading", options: .new, context: nil)
        let request = URLRequest(url: url) //url is defined elsewhere
        webView.navigationDelegate = self
        webView.load(request)
        webView.allowsBackForwardNavigationGestures = true
        webView.uiDelegate = self
        backButton.isEnabled = false
        forwardButton.isEnabled = false
    }

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {            
        if(keyPath == "loading"){
            backButton.isEnabled = webView.canGoBack
            forwardButton.isEnabled = webView.canGoForward
        }
    }

    @IBAction func back(_ sender: UIBarButtonItem) {
        webView.goBack()
    }

    @IBAction func forward(_ sender: UIBarButtonItem){
        webView.goForward()
    }    

    @IBAction func reload(_ sender: UIBarButtonItem) {
        let request = URLRequest(url: webView.url!)
        webView.load(request)
    }

    func webView(_ webView: WKWebView,
                 decidePolicyFor navigationAction: WKNavigationAction,
                 decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
       // Custom logic here
     }
}

最佳答案

尝试使用以下委托(delegate)方法,

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

func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
    decisionHandler(.allow)
}

你实现了一个但没有调用decisionHandler(.allow)

关于ios - WKWebView goBack 需要两次调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48406134/

相关文章:

ios - Objective C 中的 RSA 实现

ios - 如何让 CAShapeLayer 快速处理约束?

swift - 闭包捕获值类型

javascript - iOS 11.3 WKWebView : input. focus() 不执行任何操作

iphone - 如何通过按钮退出应用程序?

ios - 如何以编程方式从 iOS Swift 3 中的 XIB 推送并呈现给 UIViewController

iOS 11 大型标题更改事件

swift - 我们可以在不强制转换的情况下快速测试符合相同协议(protocol)的对象是否相同吗?

javascript - WKWebView中使用scrollIntoVIew跳转到页面顶部

javascript - WKWebView - 更改视口(viewport)?