我正在开发一个使用 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/