swift - WKWebView Basic auth 弹出窗口出现两次并且应用程序崩溃

标签 swift xcode

我正在尝试向我的 iOS 应用程序的 WKWebView 添加基本身份验证功能。基本身份验证弹出窗口以正确的方式显示。
但当我输入正确的信息后,弹出窗口再次出现,当我再次输入信息时,应用程序崩溃了。控制台显示'NSInternalInconsistencyException', reason: 'Completion handler passed to -[SFSafariViewController.WebViewViewController webView:didReceiveAuthenticationChallenge:completionHandler:] was not called' .
在第二个弹出窗口后面,网站内容已经显示出来,所以我认为基本身份验证弹出窗口的调用方式是错误的。
我应该在哪里修复?

这是我的代码:

import UIKit
import WebKit

class WebViewViewController: UIViewController, WKUIDelegate, WKNavigationDelegate {

    @IBOutlet weak var webView: WKWebView!

    var startUrl = "http://basic-auth-page.com"
    var pageTitle: String?
    var requestUrl: String?

    override func loadView() {
        super.loadView()
        webView.uiDelegate = self
        webView.navigationDelegate = self
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        webView.allowsBackForwardNavigationGestures = true

        if let url = URL(string: startUrl) {
            let request = URLRequest(url: url)
            webView.load(request)
        }
    }

    // open "target_blank" link
    func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {

        if navigationAction.targetFrame == nil {
            webView.load(navigationAction.request)
        }
        return nil
    }

    // for basic auth
    func webView(_ webView: WKWebView, didReceive didReceiveAuthenticationChallenge: URLAuthenticationChallenge, completionHandler: @escaping(URLSession.AuthChallengeDisposition, URLCredential?) -> Void){
        let alertController = UIAlertController(title: "Authentication Required", message: "This is an alert.", preferredStyle: .alert)
        weak var usernameTextField: UITextField!
        alertController.addTextField { textField in
            textField.placeholder = "Username"
            usernameTextField = textField
        }
        weak var passwordTextField: UITextField!
        alertController.addTextField { textField in
            textField.placeholder = "Password"
            textField.isSecureTextEntry = true
            passwordTextField = textField
        }
        alertController.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: { action in
            completionHandler(.cancelAuthenticationChallenge, nil)
        }))
        alertController.addAction(UIAlertAction(title: "Log In", style: .default, handler: { action in
            let credential = URLCredential(user: usernameTextField.text!, password: passwordTextField.text!, persistence: URLCredential.Persistence.forSession)
            completionHandler(.useCredential, credential)
        }))
        self.present(alertController, animated: true, completion: nil)
    }

    @IBAction func prevBtn(_ sender: UIBarButtonItem) {
        if webView.canGoBack {
            webView.goBack()
        }
    }

    @IBAction func nextBtn(_ sender: UIBarButtonItem) {
        if webView.canGoForward {
            webView.goForward()
        }
    }

    @IBAction func refreshBtn(_ sender: UIBarButtonItem) {
        webView.reloadFromOrigin()
    }

    @IBAction func doneBtn(_ sender: UIBarButtonItem) {
        let initialBoard = storyboard!.instantiateViewController(withIdentifier: "initialBoard")
        self.present(initialBoard, animated: true, completion: nil)
    }

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}

===编辑===
当第二个弹出窗口出现时,我发现了另一个控制台警告日志。
Warning: Attempt to present <UIAlertController: 0x7fa46d88a600> on <SFSafariViewController.WebViewViewController: 0x7fa46f10b350> which is already presenting <UIAlertController: 0x7fa46e819000>

最佳答案

尝试将您的 WebView 回调替换为:

func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
    <#code#>
}

关于swift - WKWebView Basic auth 弹出窗口出现两次并且应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46872699/

相关文章:

ios - AwakeFromNib 没有导出

ios - 尝试在 Objective C 中调用 Swift 方法时没有可见的 @interface

ios - Xcode 10 测试版 6 错误 : accessing build database

xcode - 我可以从 Xcode 检查核心数据模型吗?

iphone - 推式转场场景有效,模态转场场景不行?

swift - 使用私有(private) Google 存储的 Firebase iOS SDK 身份验证

ios - UIResponder 不识别选择器

ios - 其他 UIView 下的 UIGestureRecognizer

ios - 如何用XCode的Interface Builder设计一个超长的Scrollview

xcode - 为什么编译XCode项目可与Apple-(B)uild一起使用,而无法与Apple-(U)nit测试一起编译?