Выйти из учетных записей / Очистить навигацию, когда WebView уйдет в отставку - PullRequest
0 голосов
/ 10 июля 2020

Я реализую WebView в приложении своей компании, этот WebView предназначен для пользователя, чтобы он мог войти в свою учетную запись в веб-приложении, чтобы он мог выполнить задачу, которую невозможно выполнить в самом приложении.

У меня есть проблема: я вхожу в учетную запись в WebView, после того как я изменю учетную запись пользователя в приложении, учетная запись, отображаемая в WebView, по-прежнему будет той, в которую я вошел впервые, что является проблемой, потому что весь контент WebView должен быть отправлен в отставку каждый раз, когда я закрываю WebView V C.

Вот мой код:

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?

Заранее спасибо

1 Ответ

1 голос
/ 10 июля 2020

Вы можете использовать / изменить следующее расширение для очистки веб-данных и файлов 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() //
            }
        }
    }
}

Попробуйте и дайте мне знать, если у вас возникнут проблемы.

...