【问题标题】:Log out of accounts / Clear navigation when WebView is resignedWebView 退出时注销帐户/清除导航
【发布时间】:2020-10-31 07:29:04
【问题描述】:

我正在我公司的应用程序中实现一个WebView,这个WebView是为用户在webApp上登录自己的帐户而完成的,这样他就可以完成在应用程序本身无法执行的任务。

我的问题是:我在WebView中登录了一个账户,一旦我在App中更改了用户账户,WebView中显示的账户仍然是我第一次登录的那个,这是一个问题,因为所有内容每次我关闭 WebView VC 时都应该退出 WebView。

这是我的代码:

class DashboardWebView: UIViewController, WKNavigationDelegate {

// MARK: - Outlets

@IBOutlet var webView: WKWebView?
    
// MARK: - Public

var url: URL?
var shouldAutoLogin = false
var shouldRefetch: (() -> Void)?

// MARK: - View life cycle

override func viewDidLoad() {
    super.viewDidLoad()
    webView?.navigationDelegate = self
    title = R.string.localizable.dashboard_webview_title().uppercased()
    setNavigationBarStyle(style: NavigationBarStyle.gradientWhiteNoBorder)
    navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(close))
    
    if let url = url, let webView = webView {
        webView.load(URLRequest(url: url))
    }
}

override func viewWillDisappear(_ animated: Bool) {
    shouldRefetch?()
}

func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
    print(error)
}

func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
    if shouldAutoLogin == true {
        // This is maid to log in the right Environement, but are not credentials of a user account
        let user = "user"
        let password = "passWOrd!"
        let credential = URLCredential(user: user, password: password, persistence: URLCredential.Persistence.none)
        challenge.sender?.use(credential, for: challenge)
        completionHandler(URLSession.AuthChallengeDisposition.useCredential, credential)
    }
}

// MARK: -  Methods

@objc private func close() {
    self.navigationController?.dismiss(animated: true)
}

}

webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void)

用于通过稳定环境,这里的凭据不是帐户的凭据,我在评论此方法时也遇到了同样的问题。

我的问题: 可以有一个私人导航,每次我杀死/实例化 WebView 时删除所有参数?

提前谢谢你

【问题讨论】:

    标签: ios swift webview uiviewcontroller wkwebview


    【解决方案1】:

    您可以根据您的要求使用/修改以下扩展程序来清理 Web 数据和 cookie。它应该适用于您的情况。

    extension WKWebView {
    
        class func clean(completion : @escaping () -> Void) {
            
            guard #available(iOS 9.0, *) else {return}
    
            HTTPCookieStorage.shared.removeCookies(since: Date.distantPast)
            let dispatch_group = DispatchGroup()
            WKWebsiteDataStore.default().fetchDataRecords(ofTypes: WKWebsiteDataStore.allWebsiteDataTypes()) { records in
                records.forEach { record in
                    dispatch_group.enter()
                    WKWebsiteDataStore.default().removeData(ofTypes: record.dataTypes, for: [record], completionHandler: {
                        dispatch_group.leave()
                    })
                    #if DEBUG
                        print("WKWebsiteDataStore record deleted:", record)
                    #endif
                }
                dispatch_group.notify(queue: DispatchQueue.main) {
                    completion() //
                }
            }
        }
    }
    

    尝试一下,如果您遇到任何问题,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-23
      相关资源
      最近更新 更多