2016-07-30 94 views
2

正在处理一些FirAuth的事情,但由于某种原因,我无法弄清楚如何检查用户提出的电子邮件地址是否已被使用。我曾尝试拨打.fetchProvidersForEmail,正如其他问题中提到的那样,但无论出于何种原因,它都无法正常工作。另外,对于完成处理程序,我非常青睐,所以对此的任何建设性批评也会受到欢迎。所以,现在,我的代码,涉及到这个部分是:如何检查电子邮件地址是否已被使用Firebase

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

那么这种情况是,答复总是打印true,可能是因为我明确地在上面定义到。无论哪种方式,它几乎就好像完成处理程序不等待实际完成它的值之前returns。我试图找出如何使用它们,以及AsyncTasks,但我想知道是否有一个简单的错误,我在这里可以解决这个问题。谢谢大家!

回答

4

这个答案花了我很长时间才发现,但在这里。

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,即" "而不是"",则会返回某种错误代码。我正在寻找的两个最重要的返回代码是1700917011。这是因为如果返回17009(表示密码错误),那么我们知道已经有一个电子邮件地址与该建议的地址相关联,所以用户不应该能够注册一个新的地址。下一个代码17011非常简单。这意味着没有使用该文件的用户可以使用该电子邮件地址,该用户可以使用该用户的电子邮件地址。我用这个调用这个函数:

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

,并管理这源于它的boolean。希望这可以帮助其他人在相同的情况!

+0

谢谢发布!这很丑陋,但需要有一种方法来完成这个/以某种方式/。我感谢你分享! –

5

我试过.fetchProviders(forEmail: String, completion: FIRProviderQueryCallback?),如果在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引发的所有可能的errors的列表。

相关问题