SWIFT WKWebView GoBack和GoForward不再工作 [英] Swift WKWebView goBack and goForward No Longer Work
本文介绍了SWIFT WKWebView GoBack和GoForward不再工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我以前从未见过这样的错误。下面的代码以前运行得很好。我看不到我会做出任何改变来改变这一点。现在,GoBack和GoForward不能按预期工作。发生了什么?这非常奇怪。
我尝试过跟踪它,各种各样的东西,我不明白为什么点击它时它不会返回。我甚至尝试在单击Back之后添加webView.reload(),但也不起作用。
我得到这个错误:Error Domain=NSURLErrorDomain Code=-999 "(null)"
后跟我试图访问的页面。这是我的班级:
class WebPageModalViewController: UIViewController, WKUIDelegate, WKNavigationDelegate {
@IBOutlet weak var mainView: UIView!
@IBOutlet weak var primaryLabel: UILabel!
@IBOutlet weak var secondaryLabel: UILabel!
@IBOutlet weak var backButtonImageView: UIImageView!
@IBOutlet weak var forwardButtonImageView: UIImageView!
@IBAction func didClickClose(_ sender: Any) {
IHProgressHUD.dismiss()
dismiss(animated: true, completion: nil)
}
@IBAction func didClickOpenInBrowser(_ sender: Any) {
URL.openURL(self.url)
}
var url: String
var webView: WKWebView!
init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?, url: String) {
self.url = url
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
let backGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))
backButtonImageView.isUserInteractionEnabled = true
backButtonImageView.addGestureRecognizer(backGestureRecognizer)
let forwardGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))
forwardButtonImageView.isUserInteractionEnabled = true
forwardButtonImageView.addGestureRecognizer(forwardGestureRecognizer)
self.primaryLabel.text = ""
self.secondaryLabel.text = ""
webView.scrollView.delegate = self
let myURL = URL(string:url)
let myRequest = URLRequest(url: myURL!)
webView.load(myRequest)
setTintColor(backButtonImageView, enabled: false)
setTintColor(forwardButtonImageView, enabled: false)
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
}
override var preferredStatusBarStyle : UIStatusBarStyle {
return .lightContent
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
IHProgressHUD.dismiss()
}
override func loadView() {
super.loadView()
let webConfiguration = WKWebViewConfiguration()
webView = WKWebView(frame: .zero, configuration: webConfiguration)
webView.uiDelegate = self
webView.navigationDelegate = self
webView.addObserver(self, forKeyPath: #keyPath(WKWebView.title), options: .new, context: nil)
webView.addObserver(self, forKeyPath: #keyPath(WKWebView.canGoForward), options: .new, context: nil)
webView.addObserver(self, forKeyPath: #keyPath(WKWebView.canGoBack), options: .new, context: nil)
if (webView != nil) {
mainView.addConstrained(subview: webView!)
}
}
// MARK: WkWebview
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
IHProgressHUD.show()
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
IHProgressHUD.dismiss()
}
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
IHProgressHUD.dismiss()
BannerManager.errorLoadingWebpage.show()
dismiss(animated: true, completion: nil)
}
func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
guard let failingUrlStr = (error as NSError).userInfo["NSErrorFailingURLStringKey"] as? String else { return }
let failingUrl = URL(string: failingUrlStr)!
switch failingUrl {
// Needed to open Appstore-App
case _ where failingUrlStr.hasPrefix("itms-appss://"):
if UIApplication.shared.canOpenURL(failingUrl) {
UIApplication.shared.open(failingUrl, options: [:], completionHandler: nil)
IHProgressHUD.dismiss()
dismiss(animated: true, completion: nil)
return
} else {
self.webView(webView, didFail: navigation, withError: error)
}
default: self.webView(webView, didFail: navigation, withError: error)
}
}
// func webView(_ webView: WKWebView,
// decidePolicyFor navigationAction: WKNavigationAction,
// decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
//
// // if the url is not http(s) schema, then the UIApplication open the url
// if let url = navigationAction.request.url,
// !url.absoluteString.hasPrefix("http://"),
// !url.absoluteString.hasPrefix("https://"),
// UIApplication.shared.canOpenURL(url) {
//
// UIApplication.shared.open(url, options: [:], completionHandler: nil)
// // cancel the request
// decisionHandler(.cancel)
// } else {
// // allow the request
// decisionHandler(.allow)
// }
// }
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
if keyPath == "title" {
self.primaryLabel.text = webView.title
self.secondaryLabel.text = webView.url?.absoluteString
} else if keyPath == "canGoBack" {
setTintColor(backButtonImageView, enabled: webView.canGoBack)
} else if keyPath == "canGoForward" {
setTintColor(forwardButtonImageView, enabled: webView.canGoForward)
}
}
// MARK: Private Funcs
private func setTintColor(_ image:UIImageView, enabled:Bool) {
image.tintColor = enabled ? UIColor.textSecondary : UIColor.ECHLightGrey
}
@objc func imageTapped(tapGestureRecognizer: UITapGestureRecognizer) {
let tappedImage = tapGestureRecognizer.view as! UIImageView
if tappedImage == backButtonImageView {
webView.goBack()
} else if tappedImage == forwardButtonImageView {
webView.goForward()
}
}
}
extension WebPageModalViewController : UIScrollViewDelegate {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollView.contentOffset.x = 0
}
}
任何想法都很棒!
推荐答案
我们看到了相同的问题。
我们的调查表明,这种情况在iOS 13.4或13.4.1发布时就开始发生了(没有开启13.4的设备来验证这一点),但在那之前它工作得很好。
到目前为止,我还没有找到解决此问题的方法,但我确实有解决办法。
我观察到的情况是,在速度较慢的网络上以及当用户在页面完全加载之前进行交互时,这种情况更常见。如果用户在页面加载完成之前回击,则会发生错误。此错误基本上表示&已取消&并引用了他们要离开的页面。如果他们让页面加载完成,显然不会发生这种错误。现在重要的是,此时Web视图状态为正在加载。
但是,如果他们要返回的页面在离开时没有完成加载,则会再次抛出错误,但这一次引用的是他们要返回的页面。更重要的是,此时不再加载Web视图。我们所做的是监视并检查页面是否未加载,如果未加载,则重新加载。这似乎奏效了,虽然不是很理想,但它为我们争取了一些时间来研究适当的解决方案。
此外,我对此设置了重试限制,在第三次尝试后,我们显示了一个错误的重新加载按钮,尽管实际上我们从未见过它超过第一次重新加载尝试。
错误几乎是瞬间引发的,这意味着重新加载不会给用户增加可察觉的延迟。
希望这能有所帮助。
这篇关于SWIFT WKWebView GoBack和GoForward不再工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文