Swift Firebase check if email is already in use

青春壹個敷衍的年華 提交于 2019-12-25 08:17:58

问题


I want to be able to check if an email address is already been used (so if somebody put test1@test.com but another user already registered with that email account).

I have a simple test if it has NOT been used an image view shows a green arrow, if it HAS been used then it is red x

when I create the user I use the following code

FIRAuth.auth()?.createUser(withEmail: email, password: password, completion: { (user, error) in

    if error == nil {

      self.ref.child("userEmails").child((user?.uid)!).setValue(email)


      FIRAuth.auth()!.signIn(withEmail: email,
                             password: password)

    } else {
      //registration failure
    }

what I am trying to do to check is

func checkIfEmailExists(textField: UITextField) {

    let ref = FIRDatabase.database().reference()

    let email = firstContainerTextField.text ?? ""

    ref.child("userEmails").queryEqual(toValue: email)
      .observe(.value, with: { snapshot in

        if (self.firstContainerTextField.text?.isEmpty)! {
          self.firstContainerImage.image = UIImage.init(named: "emptyBlue.png")

        } else if !(self.firstContainerTextField.text?.isEmpty)! && !snapshot.exists() {
          self.firstContainerImage.image = UIImage.init(named: "redEx.png")

        } else if snapshot.exists() {
          self.firstContainerImage.image = UIImage.init(named: "greenCheck.png")
        }

    });

}

So far it does not work as I can see in my database that test1@test.com exists. Can somebody tell me what I missed?

EDIT

I have updated my code. I am using hasChildren and I searched for similar questions and they seem to point this direction, but I still cannot get the result I am looking for

func checkIfEmailExists(textField: UITextField) {

let ref = FIRDatabase.database().reference()

let email = firstContainerTextField.text ?? ""

ref.child("userEmails").queryEqual(toValue: email)
  .observe(.value, with: { snapshot in

    if !snapshot.hasChildren() {

      self.firstContainerImage.image = UIImage.init(named: "redEx.png")

    } else {

      for child in snapshot.children.allObjects as! [FIRDataSnapshot] {

        let tmp = child.value as! String


        if tmp == email {

          self.firstContainerImage.image = UIImage.init(named: "greenCheck.png")

        }

      }
    }

  });
}

Edit 2

I changed how I set my user up

self.ref.child("users").child((user?.uid)!).setValue(["Email": email])

so now my database looks like this

users
    *****uid*****
        Email: "test@test.com

回答1:


As I commented earlier: you'll need to check whether the query has any results by calling snapshot.hasChildren().

func checkIfEmailExists(textField: UITextField) {

    let ref = FIRDatabase.database().reference()

    let email = firstContainerTextField.text ?? ""

    ref.child("userEmails").queryEqual(toValue: email)
      .observe(.value, with: { snapshot in
        if (!snapshot.hasChildren()) {
            // User doesn't exist yet...
        }
    });

}



回答2:


The following is the structure of the Firebase function you might be looking for (Swift 4):

Auth.auth().fetchProviders(forEmail: emailAddress, completion: {
        (providers, error) in

        if let error = error {
            print(error.localizedDescription)
        } else if let providers = providers {
            print(providers)
        }
    })

If the email address is already registered to a user, you will get a list of the providers that the email address is used for. Otherwise, the list of providers will be empty, and thus the email address is not registered.



来源:https://stackoverflow.com/questions/41372354/swift-firebase-check-if-email-is-already-in-use

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!