Swift Firebase检查电子邮件是否已被使用

问题描述:

我希望能够检查电子邮件地址是否已被使用(所以如果有人把[email protected],但另一个用户已经注册了该电子邮件帐户)。Swift Firebase检查电子邮件是否已被使用

我有一个简单的测试,如果它没有被使用的图像视图示出了绿色箭头,如果已经使用它,然后它是红色的x

当我创建我使用以下代码

用户
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 
    } 

什么,我试图做的是检查

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") 
     } 

    }); 

} 

到目前为止,这是行不通的,因为我可以在我的数据库[email protected]存在看。 有人能告诉我我错过了什么吗?

编辑

我已经更新了我的代码。我使用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() { 

     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") 

     } 

     } 
    } 

    }); 
} 

编辑2

我改变了我设定的结果我用户最多

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

所以现在我的数据库看起来像这样

users 
    *****uid***** 
     Email: "[email protected] 
+0

当您针对Firebase数据库执行查询时,可能会有多个结果。所以快照包含了这些结果的列表。即使只有一个结果,快照也会包含一个结果列表。如果没有结果,你会得到一个空的列表。你会想检查'snapshot.hasChildren()'。请参阅https://firebase.google.com/docs/reference/ios/firebasedatabase/api/reference/Classes/FIRDataSnapshot#-haschildren –

+0

@FrankvanPuffelen我读了那个文档,看到了snapshot.hasChild(String)...当我使用,并在电子邮件中输入我得到一个崩溃说(hasChild :)必须是一个非空字符串,不包含'。' '''''''''''''''' – RubberDucky4444

+0

我连接到'hasChildren()'(复数),而不是'hasChild()'(它需要一个字符串参数来指示要检查的孩子)。 –

正如我之前所说:您需要通过调用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... 
     } 
    }); 

} 
+0

我已经尝试过与其他SO答案结合使用,但我仍然无法使其工作。 – RubberDucky4444

以下是你可能会寻找Firebase function的(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) 
     } 
    }) 

如果电子邮件地址已注册用户,您将获得的列表提供商的电子邮件地址用于。否则,提供者列表将为空,因此电子邮件地址未被注册。