即使登录错误也能登录

时间:2017-03-26 17:10:10

标签: ios swift authentication firebase

我正在使用Firebase进行登录/注册身份验证,但我遇到了问题。我已经完成了所有设置并且工作正常,但我在登录部分遇到了一些问题。

这是我的代码:

@IBAction func clickLogin(_ sender: UIButton) {

    FIRAuth.auth()?.signIn(withEmail: emailTextField.text!, password: passwordTextField.text!, completion: { (user, error) in

        if let error = error {
            print(error.localizedDescription)
        }
    })

    performSegue(withIdentifier: "toMainSegue", sender: self) //Issue
}

如果电子邮件或密码不正确,它仍会执行segue,这是错误的。我试过了:

@IBAction func clickLogin(_ sender: UIButton) {

    FIRAuth.auth()?.signIn(withEmail: emailTextField.text!, password: passwordTextField.text!, completion: { (user, error) in

        if let error = error {
            print(error.localizedDescription)
        } else {
            performSegue(withIdentifier: "toMainSegue", sender: self) //Error Line
        }
    })

但是我收到了一个错误:

  

在闭包中隐式使用'self',使用'self。'来明确捕获语义。

当且仅当登录成功时,是否有更好的方法将用户带到下一个UI?

4 个答案:

答案 0 :(得分:1)

块内使用的任何variablesmethods都需要使用‘self’

@IBAction func clickLogin(_ sender: UIButton) {

FIRAuth.auth()?.signIn(withEmail: emailTextField.text!, password: passwordTextField.text!, completion: { (user, error) in

    if let error = error {

        print(error.localizedDescription)


    } else {
        self.performSegue(withIdentifier: "toMainSegue", sender: self) //Error Line
    }
})

答案 1 :(得分:1)

在您共享的代码中

    @IBAction func clickLogin(_ sender: UIButton) {

    FIRAuth.auth()?.signIn(withEmail: emailTextField.text!, password: passwordTextField.text!, completion: { (user, error) in

        if let error = error {
            print(error.localizedDescription)
        }
    })

    performSegue(withIdentifier: "toMainSegue", sender: self) //Issue
}

{@ 1}}方法在@IBAction中调用,而不是在signIn(withEmail:password:completion)方法的完成处理程序内调用。因此,无论后者编写或执行什么内容,都会调用performSegue(withIdentifier:sender:)。尝试将代码修改为以下

performSegue(withIdentifier:sender:)

请记住,因为逻辑是在闭包中执行的,所以需要在方法和变量之前指定 @IBAction func clickLogin(_ sender: UIButton) { FIRAuth.auth()?.signIn(withEmail: emailTextField.text!, password: passwordTextField.text!, completion: { (user, error) in if let error = error { print(error.localizedDescription) } else { self.performSegue(withIdentifier: "toMainSegue", sender: self) } }) } 前缀!

答案 2 :(得分:0)

即使登录凭据错误,每次API成功命中时,您的代码都会进入else部分。

FIRAuth API必须在命中时返回一些数据,例如名为“success”= 1或0的字符串或字典。检查ur else部分是否成功为true或false。错误的凭证和真实的正确凭证。

如果网络错误或API的参数格式错误或任何其他错误导致API本身出现任何错误,则会执行错误部分。

在你的情况下,它会被击中并返回结果。如果您的用户确实已登录,则必须检查结果字典,并根据该结果转到下一个控制器。

答案 3 :(得分:0)

试试这个。这就是我登录的方式。

FIRAuth.auth()?.signIn(withEmail: emailField.text!, password: passwordField.text!, completion: { user, error in
        if error == nil {
            print("Successfully Logged IN \(user!)")
            self.performSegue(withIdentifier: "signedIn", sender: self)
        }
    })

这只是测试登录过程中是否没有错误,然后执行segue。我没有遇到任何麻烦,而且看起来效果很好。