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]
答
正如我之前所说:您需要通过调用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)
}
})
如果电子邮件地址已注册用户,您将获得的列表提供商的电子邮件地址用于。否则,提供者列表将为空,因此电子邮件地址未被注册。
当您针对Firebase数据库执行查询时,可能会有多个结果。所以快照包含了这些结果的列表。即使只有一个结果,快照也会包含一个结果列表。如果没有结果,你会得到一个空的列表。你会想检查'snapshot.hasChildren()'。请参阅https://firebase.google.com/docs/reference/ios/firebasedatabase/api/reference/Classes/FIRDataSnapshot#-haschildren –
@FrankvanPuffelen我读了那个文档,看到了snapshot.hasChild(String)...当我使用,并在电子邮件中输入我得到一个崩溃说(hasChild :)必须是一个非空字符串,不包含'。' '''''''''''''''' – RubberDucky4444
我连接到'hasChildren()'(复数),而不是'hasChild()'(它需要一个字符串参数来指示要检查的孩子)。 –