Swift 如何检查电子邮件地址是否已在使用Firebase

Swift 如何检查电子邮件地址是否已在使用Firebase,swift,firebase-authentication,completionhandler,Swift,Firebase Authentication,Completionhandler,正在处理一些FirAuth的事情,但由于某种原因,我不知道如何检查用户提议的电子邮件地址是否已经被占用。我试着调用.fetchProvidersForEmail,正如前一段时间在其他问题中所建议的那样,但无论出于什么原因,它都不会起作用。此外,我在完成处理程序方面非常新手,所以任何建设性的批评都是欢迎的。现在,我的代码中与此相关的部分是: import UIKit import Firebase class LoginViewController: UIViewController { var

正在处理一些
FirAuth
的事情,但由于某种原因,我不知道如何检查用户提议的电子邮件地址是否已经被占用。我试着调用
.fetchProvidersForEmail
,正如前一段时间在其他问题中所建议的那样,但无论出于什么原因,它都不会起作用。此外,我在完成处理程序方面非常新手,所以任何建设性的批评都是欢迎的。现在,我的代码中与此相关的部分是:

import UIKit
import Firebase
class LoginViewController: UIViewController {
var reply : Bool = true
@IBOutlet weak var emailTxt: UITextField!

@IBAction func nextScreen(sender: UIButton) {
print(emailCheck(emailTxt.text!))
}

 func emailCheck(input : String)->Bool{
    let pullEmails = FIRAuth.auth()!.fetchProvidersForEmail(input, completion:{
        result,error in
        var decision : Bool = true
        if error == "nil" {
            print(error)
            self.reply = true
        }else{
            print(error)
            self.reply = false
        }
    })
    return reply
}
}

这样做的结果是,reply总是打印
true
,可能是因为我在顶部明确定义了它。不管是哪种方式,完成处理程序几乎都是在返回值之前不等待实际完成的。我试图找出如何使用它们,以及
AsyncTasks
,但我想知道这里是否有一个简单的错误可以解决这个问题。谢谢大家

我花了很长时间才找到这个答案,但它就在这里

func emailCheck(input: String, callback: (isValid: Bool) -> Void) {
    FIRAuth.auth()?.signInWithEmail(input, password: " ") { (user, error) in
        var canRegister = false

        if error != nil {
            if (error?.code == 17009) {
                canRegister = false
            } else if(error?.code == 17011) {
                //email doesn't exist
                canRegister = true
            }
        }

        callback(isValid: canRegister)
    }
}
这段代码工作的原因很简单。基本上,如果您将非空密码传递到Firebase,即
而不是
,您将返回某种错误代码。我要查找的两个最重要的返回代码是
17009
17011
。这是因为如果返回了
17009
(表示密码错误),那么我们知道已经有一个电子邮件地址与该提议的地址关联,因此用户应该无法注册新地址。下一个代码,
17011
非常简单。这意味着文件中没有具有给定电子邮件地址的用户,这允许用户声明它。我使用以下方法调用此函数:

mailCheck(emailTxt.text!) { isValid in
                if isValid {
                    print("valid")
                } else {
                    print("Invalid!")
                }

然后管理来自它的
布尔值。希望这能帮助其他处于同样情况的人

我尝试了
.fetchProviders(forEmail:String,completion:firrproviderquerycallback?
,如果在Firebase中提供了有效的电子邮件地址,它将以
[String]?
的形式返回密码。如果有密码,您知道有一个活动帐户:

   FIRAuth.auth()?.fetchProviders(forEmail: email, completion: { (stringArray, error) in
            if error != nil {
                print(error!)
            } else {
                if stringArray == nil {
                    print("No password. No active account")
                } else {
                    print("There is an active account")
                }
            }
        })
这是一个小黑客,但我没有找到更好的。披露:我只使用密码验证


如果您正在创建用户或登录,您将从回调中收到
.emailAlreadyInUse
错误。这是由
Auth

引发的所有可能事件的列表,感谢您发布此消息!这很难看,但需要有一种方法来实现这一点。谢谢你的分享!