使用Firebase身份验证和实时数据库执行查询时出现问题

时间:2019-08-04 20:32:36

标签: ios swift firebase firebase-realtime-database firebase-authentication

我需要通过使用Firebase处理角色读取实时数据库中的值来执行segue。

我正在使用Firebase制作iOS应用。我使用电子邮件/密码方法通过Firebase Auth进行了身份验证。我的应用程序有2个segue:第一个叫做“ inicio”,另一个叫“ inicio2”。在实时数据库中,我使用电子邮件,用户ID和名为“ isAdmin”的布尔属性来保存用户。问题是我需要根据“ isAdmin”值在登录过程中执行segue。 if isAdmin == false,我需要执行segue'inicio'; if isAdmin == true,我需要执行segue'inicio2'。这是我正在尝试的代码:

import UIKit
import FirebaseAuth
import FirebaseDatabase

class InicioSesionViewController: UIViewController {

@IBOutlet weak var correo: UITextField!
@IBOutlet weak var password: UITextField!

var ref: DatabaseReference!

override func viewDidLoad() {
    super.viewDidLoad()

    ref = Database.database().reference()

    correo.text = ""
    password.text = ""

    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: Selector(("ocultarTeclado")))
    view.addGestureRecognizer(tap)
}

//MARK: ViewDidAppear().
override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    correo.text = ""
    password.text = ""
}

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

    sesionActiva()
}

@IBAction func ingresar(_ sender: UIButton) {
    if correo.text != "" && password.text != "" {
        guard let email = correo.text else { return }
        guard let contraseña = password.text else { return }
        inicioSesion(correo: email, pass: contraseña)
    } else {
        let alerta = UIAlertController(title: "Atención", message: "Ingrese correo electrónico y contraseña.", preferredStyle: .alert)
        let aceptar = UIAlertAction(title: "Aceptar", style: .default, handler: nil)
        alerta.addAction(aceptar)
        present(alerta, animated: true, completion: nil)
    }
}

func inicioSesion(correo: String, pass: String){
    Auth.auth().signIn(withEmail: correo, password: pass){ (user, error) in
        if user != nil {
            self.ref.child("users").childByAutoId().observe(DataEventType.value) { (snapshot) in
                let value = snapshot.value as? NSDictionary
                let admin = value?["isAdmin"] as? Bool

                if admin == false {
                    self.performSegue(withIdentifier: "inicio", sender: self)
                    print("Entró")
                } else {
                    self.performSegue(withIdentifier: "inicio2", sender: self)
                    print("Entró")
                }
            }
        } else {
            if let error = error?.localizedDescription {
                print("Error en Firebase", error)
            } else {
                print("Error en el código")
            }

            let alerta = UIAlertController(title: "Atención", message: "Se produjo un error al iniciar sesión. Verifique que el correo electrónico y la contraseña sean correctas.", preferredStyle: .alert)
            let aceptar = UIAlertAction(title: "Aceptar", style: .default, handler: nil)
            alerta.addAction(aceptar)
            self.present(alerta, animated: true, completion: nil)
        }
    }
}

//Función para ocultar teclado en cualquier parte de la vista.
@objc func ocultarTeclado(){
    self.view.endEditing(true)
}

//Comprueba si la sesion estaba iniciada.
func sesionActiva(){
    Auth.auth().addStateDidChangeListener { (auth, error) in
        if error == nil {
            print("No estamos logueados")
        } else {
            print("Si estamos logueados")
            self.performSegue(withIdentifier: "inicio", sender: self)
        }
    }
}

}

实际上,仅执行“ inicio” segue。

0 个答案:

没有答案