Firebase身份验证未被调用并返回null用户(Swift)

时间:2017-08-10 20:23:44

标签: ios swift firebase firebase-authentication

我刚开始学习swift 3而且我来自.NET背景。 我无法使用我的应用程序使用firebase对用户进行身份验证。我试图创建一个通用函数,然后调用另一个Firebase函数。



    let user = logIn(email: email, password: password)
    if user != nil{
         self.navigationController?.pushViewController(MainVC(), animated:   true)
    }

 

    func logIn(email: String,password: String) -> Firebase.User? {
            var loginUser:Firebase.User?

            Auth.auth().signIn(withEmail: email, password: password) { (user, error) in
                if(error != nil){
                    print(error!)
                    return
                }


                if let firebaseUser = user {
                    loginUser = firebaseUser
                }
            }
            if let user = loginUser{
                return user
            }
            else {
                return nil
            }
        }

在我的调试过程中,我发现 Auth.auth()。signIn 函数被跳过而没有被某些人执行,并返回null。但是,当我再次运行应用程序时,我发现firebase验证了我的用户!

1 个答案:

答案 0 :(得分:0)

问题是signIn是异步函数,需要一些时间才能执行。这意味着当您调用logIn函数时,在signIn能够为您登录之前,您的else { return nil}会执行,并且返回的值为零。

你不应该从这个函数返回,你应该做的是使用回调:所以用这个替换你的函数头。

func logIn(email: String,password: String, callback: @escaping (Firebase.User?) -> ()) {

删除功能中的最后一个if因为您不需要它,所有内容都将在signIn块中处理。

signIn块内的代码替换为:

if error != nil {
  print(error!)
  callback(nil)
}

if let firebaseUser = user {
  callback(firebaseUser)
}

现在您必须将调用logIn函数的方式更改为:

logIn(email: yourEmail, password: yourPassword) { (firebaseUser: Firebase.User?) in
  // Your result is saved in firebaseUser variable
}

整个代码

// CALL LOGIN FUNCTION

logIn(email: yourEmail, password: yourPassword) { (firebaseUser: Firebase.User?) in
  // Your result is saved in firebaseUser variable
  if firebaseUser != nil{
    self.navigationController?.pushViewController(MainVC(), animated:   true)
  }

}

// LOGIN FUNCTION

func logIn(email: String,password: String, callbacK: @escaping (Firebase.User?) -> ()) {
  Auth.auth().signIn(withEmail: email, password: password) { (user, error) in
    if error != nil {
      print(error!)
      callback(nil)
    }

    callback(firebaseUser)
  }
}

我还没有对此进行过测试,所以也许你必须做一些小修改,但这是正确的做法。我希望你明白这一点。