Firebase在iOS上自动登录

时间:2016-07-27 22:59:31

标签: ios swift login firebase firebase-authentication

有没有更好的方法让用户自动登录到应用程序,只要他们已经登录过去;除了将他们的登录详细信息直接保存到可能不安全的存储空间之外?

由于

PS:我正在使用Firebase和Swift for iOS

编辑:这是代码

import UIKit
import Firebase

class loginVC: UIViewController {

    @IBOutlet weak var emailTextField: UITextField!
    @IBOutlet weak var passwordTextField: UITextField!
    @IBOutlet weak var errorLabel: UILabel!

    override func viewDidAppear(animated: Bool) {
        automaticLogin()
    }

    @IBAction func loginTapped(sender: AnyObject) {
        errorLabel.text = ""
        FIRAuth.auth()?.createUserWithEmail(emailTextField.text!, password: passwordTextField.text!, completion: {
            user, error in
            if error != nil {
                FIRAuth.auth()?.signInWithEmail(self.emailTextField.text!, password: self.passwordTextField.text!, completion: { (user, error) in
                    if error == nil {
                        self.login()
                    } else if error != nil {
                        self.errorLabel.text = ("Invalid email address or password")
                        print(error)
                    }
                })
            } else {
                print("user created")
                self.login()
                print(user?.displayName)
            }
        })
    }

    @IBAction func forgotPasswordTapped(sender: AnyObject) {
        let email = emailTextField.text
        errorLabel.text = ""

        FIRAuth.auth()?.sendPasswordResetWithEmail(email!) { error in
            if error != nil {
                self.errorLabel.text = ("Invalid email address")
                print(error)
            } else {
                self.errorLabel.text = ("Password reset email successfully sent")
                print("password reset email sent")
            }
        }
    }

    func login() {
        FIRAuth.auth()?.signInWithEmail(emailTextField.text!, password: passwordTextField.text!, completion: {
            user, error in
            if error != nil {
                self.errorLabel.text = ("Invalid email address or password")
                print(error)
            } else {
                print("login successful")
                self.checkIfUserIsNew()
            }
        })
    }

    func checkIfUserIsNew() {
        if FIRAuth.auth()?.currentUser?.displayName != nil || FIRAuth.auth()?.currentUser?.displayName == "" {
            self.performSegueWithIdentifier("showChatVC", sender: self)
        } else {
            self.performSegueWithIdentifier("showOptionsVC", sender: self)
        }
    }

    func automaticLogin() {
        FIRAuth.auth()?.addAuthStateDidChangeListener { auth, user in
            if user == user {
                print("still signed in")
            } else {
                print("not signed in")
            }
        }
    }

我还用它来注销用户:

    @IBAction func logOutTapped(sender: AnyObject) {
    try! FIRAuth.auth()?.signOut()
    performSegueWithIdentifier("showLoginVC", sender: self)
    print(FIRAuth.auth()?.currentUser?.displayName)
}

1 个答案:

答案 0 :(得分:0)

您可能想要使用NSUserDefaults。要在login()函数中执行此操作,您可能希望在用户登录或创建帐户后保存用户的数据。在您的登录功能中,您可以首先创建新变量来获取用户的电子邮件/密码。

let userDefaults = UserDefaults.standard
userDefaults.setValue(self.emailField.text!, forKey: "email")
userDefaults.setValue(self.passField.text!, forKey: "password")

接下来,您还需要实现一个名为viewWillAppear的新函数,该函数将在视图控制器之前调用。你也可以在登录函数中添加一些参数。

override func viewWillAppear(_ animated: Bool) {
    let userDefaults = UserDefaults.standard

    if userDefaults.string(forKey: "email") != nil {

        let email = userDefaults.string(forKey: "email")

        let password = userDefaults.string(forKey: "password")


        login(email: email!, password: password!)

    }
}

if语句将检查您的用户是否已经注册了他们的电子邮件帐户。最后,您需要更新登录功能以包含两个参数,以传递用户的电子邮件和密码。