身份验证完成后关闭 WKWebView

时间:2021-02-23 22:46:08

标签: ios swift authentication webkit spotify

我正在尝试更新我的应用程序的 Web 视图控制器,其目的是验证用户的 Spotify 帐户。 VC 最初是使用 UIWebView 编码的,我正在尝试将其转换为较新的 WebKit。到目前为止一切顺利,但我无法在完成身份验证后关闭 webView。我很确定它与代表有关,这是一个我仍在努力理解的编程概念。提前致谢!

这是原始代码:

import UIKit

@objc protocol WebViewControllerDelegate {
    func webViewControllerDidFinish(_ controller: WebViewController)
    @objc optional func webViewController(_ controller: WebViewController, didCompleteInitialLoad didLoadSuccessfully: Bool)
}

class WebViewController: UIViewController {

    // MARK: - Variables

var loadComplete: Bool = false
var initialURL: URL!
var webView: UIWebView!
var delegate: WebViewControllerDelegate?

// MARK: - Init

init(url URL: URL) {
    super.init(nibName: nil, bundle: nil)
    self.initialURL = URL
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

// MARK: - View Lifecycle

override func viewDidLoad() {
    super.viewDidLoad()
    let initialRequest = URLRequest(url: self.initialURL)
    webView = UIWebView(frame: self.view.bounds)
    webView.delegate = self
    webView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    view.addSubview(self.webView)
    
    let doneBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(self.tappedDone))
    navigationItem.leftBarButtonItem = doneBarButtonItem
    webView.loadRequest(initialRequest)
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    UIApplication.shared.statusBarStyle = .default
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    UIApplication.shared.statusBarStyle = .lightContent
}

// MARK: - IBAction

@objc func tappedDone() {
    delegate?.webViewControllerDidFinish(self)
    presentingViewController?.dismiss(animated: true, completion: nil)
}

}
// MARK: - UIWebViewDelegate

extension WebViewController: UIWebViewDelegate {
    func webViewDidFinishLoad(_ webView: UIWebView) {
        if !loadComplete {
            delegate?.webViewController?(self, didCompleteInitialLoad: true)
            loadComplete = true
        }
    }
    
    func webView(_ webView: UIWebView, didFailLoadWithError error: Error) {
        if !loadComplete {
            delegate?.webViewController?(self, didCompleteInitialLoad: true)
            loadComplete = true
        }
    }
}

这是我一直在编写的代码:

import UIKit
import WebKit

@objc protocol WebViewControllerDelegate {
    func webViewControllerDidFinish(_ controller: WebViewController)
    @objc optional func webViewController(_ controller: WebViewController, didCompleteInitialLoad didLoadSuccessfully: Bool)
}

class WebViewController: UIViewController {
// MARK: - Variables

var loadComplete: Bool = false
var initialURL: URL!
var webView: WKWebView!
var delegate: WebViewControllerDelegate?

// MARK: - Init

init(url URL: URL) {
    super.init(nibName: nil, bundle: nil)
    self.initialURL = URL
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

// MARK: - View Lifecycle

override func viewDidLoad() {
    super.viewDidLoad()
    let initialRequest = URLRequest(url: self.initialURL)
    webView = WKWebView(frame: self.view.bounds)
    webView.navigationDelegate = self
    webView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    view.addSubview(self.webView)
    
    let doneBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(self.tappedDone))
    navigationItem.leftBarButtonItem = doneBarButtonItem
    doneBarButtonItem.tintColor = .systemBlue
    webView.load(initialRequest)
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
}

// MARK: - IBAction

@objc func tappedDone() {
    delegate?.webViewControllerDidFinish(self)
    presentingViewController?.dismiss(animated: true, completion: nil)

   }
}

// MARK: - WKNavigationDelegate

extension WebViewController: WKNavigationDelegate {
    func webViewDidFinishLoad(_ webView: WKWebView) {
        if !loadComplete {
            delegate?.webViewController?(self, didCompleteInitialLoad: true)
            loadComplete = true
        }
    }
    
    func webView(_ webView: WKWebView, didFailLoadWithError error: Error) {
        if !loadComplete {
            delegate?.webViewController?(self, didCompleteInitialLoad: true)
            loadComplete = true
        }
    }
}

0 个答案:

没有答案