SWIFT WKWebView GoBack和GoForward不再工作 [英] Swift WKWebView goBack and goForward No Longer Work

查看:0
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆