即使关闭应用程序,如何保持用户登录?我正在使用swift 3和Firebase

Bra*_*don 0 ios firebase swift swift3 xcode8

我是编码和堆栈溢出的新手,我试图让用户在关闭应用程序后仍然保持登录状态.我也不希望他们总是在屏幕上看到登录.即使关闭应用程序并重新打开应用程序,我该如何保持用户登录.我正在使用Swift 3.0,Xcode 8和Firebase.

import UIKit
import Firebase
import SwiftKeychainWrapper


class LoginViewController: UIViewController {

    @IBOutlet weak var emailField: UITextField!
    @IBOutlet weak var pwField: UITextField!


    override func viewDidLoad() {
        super.viewDidLoad()
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(LoginViewController.dismissKeyboard))
        //Uncomment the line below if you want the tap not not interfere and cancel other interactions.
        //tap.cancelsTouchesInView = false

        view.addGestureRecognizer(tap)

        // Do any additional setup after loading the view.
    }


    func dismissKeyboard() {
        //Causes the view (or one of its embedded text fields) to resign the first responder status.
        view.endEditing(true)
    }

    @IBAction func loginPressed(_ sender: Any) {
        guard emailField.text != "", pwField.text != "" else {return}

        FIRAuth.auth()?.signIn(withEmail: emailField.text!, password: pwField.text!, completion: { (user, error) in
            if let error = error {
                print(error.localizedDescription)
            }

            if user != nil {
                let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "TabBarViewController")

                self.present(vc, animated: true, completion: nil)
            }
        })
    }
}
Run Code Online (Sandbox Code Playgroud)

下面是我的UsersViewController代码,它有注销按钮

import UIKit
Run Code Online (Sandbox Code Playgroud)

导入Firebase

class UsersViewController:UIViewController,UITableViewDelegate,UITableViewDataSource {

@IBOutlet weak var tableview: UITableView!

var user = [User]()



override func viewDidLoad() {
    super.viewDidLoad()


    retrieveUsers()
}


func retrieveUsers() {
    let ref = FIRDatabase.database().reference()

    ref.child("users").queryOrderedByKey().observeSingleEvent(of: .value, with: { snapshot in

        let users = snapshot.value as! [String : AnyObject]
        self.user.removeAll()
        for (_, value) in users {
            if let uid = value["uid"] as? String {
                if uid != FIRAuth.auth()!.currentUser!.uid {
                    let userToShow = User()
                    if let fullName = value["full name"] as? String, let imagePath = value["urlToImage"] as? String {
                        userToShow.fullName = fullName
                        userToShow.imagePath = imagePath
                        userToShow.userID = uid
                        self.user.append(userToShow)
                    }
                }
            }
        }
        self.tableview.reloadData()
    })
    ref.removeAllObservers()

}

func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableview.dequeueReusableCell(withIdentifier: "userCell", for: indexPath) as! UserCell

    cell.nameLabel.text = self.user[indexPath.row].fullName
    cell.userID = self.user[indexPath.row].userID
    cell.userImage.downloadImage(from: self.user[indexPath.row].imagePath!)
    checkFollowing(indexPath: indexPath)

    return cell
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return user.count 
}


func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let uid = FIRAuth.auth()!.currentUser!.uid
    let ref = FIRDatabase.database().reference()
    let key = ref.child("users").childByAutoId().key

    var isFollower = false

    ref.child("users").child(uid).child("following").queryOrderedByKey().observeSingleEvent(of: .value, with: { snapshot in

        if let following = snapshot.value as? [String : AnyObject] {
            for (ke, value) in following {
                if value as! String == self.user[indexPath.row].userID {
                    isFollower = true

                    ref.child("users").child(uid).child("following/\(ke)").removeValue()
                    ref.child("users").child(self.user[indexPath.row].userID).child("followers/\(ke)").removeValue()

                    self.tableview.cellForRow(at: indexPath)?.accessoryType = .none
                }
            }
        }
        if !isFollower {
            let following = ["following/\(key)" : self.user[indexPath.row].userID]
            let followers = ["followers/\(key)" : uid]

            ref.child("users").child(uid).updateChildValues(following as Any as! [AnyHashable : Any])
            ref.child("users").child(self.user[indexPath.row].userID).updateChildValues(followers)

            self.tableview.cellForRow(at: indexPath)?.accessoryType = .checkmark
        }
    })
    ref.removeAllObservers()

}


func checkFollowing(indexPath: IndexPath) {
    let uid = FIRAuth.auth()!.currentUser!.uid
    let ref = FIRDatabase.database().reference()

    ref.child("users").child(uid).child("following").queryOrderedByKey().observeSingleEvent(of: .value, with: { snapshot in

        if let following = snapshot.value as? [String : AnyObject] {
            for (_, value) in following {
                if value as! String == self.user[indexPath.row].userID {
                    self.tableview.cellForRow(at: indexPath)?.accessoryType = .checkmark
                }
            }
        }
    })
    ref.removeAllObservers()

}






@IBAction func logOutPressed(_ sender: Any) {


    do {

        try FIRAuth.auth()?.signOut()

        if FIRAuth.auth()?.currentUser == nil {

            // Remove User Session from device
            UserDefaults.standard.removeObject(forKey: "uid")
            UserDefaults.standard.synchronize()

            let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "LoginVC") as! LoginViewController

        }

    } catch let signOutError as NSError {

        // handle logout error

    }
}
Run Code Online (Sandbox Code Playgroud)

}

扩展UIImageView {

func downloadImage(from imgURL: String!) {
    let url = URLRequest(url: URL(string: imgURL)!)

    let task = URLSession.shared.dataTask(with: url) {
        (data, response, error) in

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

        DispatchQueue.main.async {
            self.image = UIImage(data: data!)
        }

    }

    task.resume()
}
Run Code Online (Sandbox Code Playgroud)

}

Con*_*nor 5

Firebase Auth可以为您处理此问题.与Firebase数据库一样,Auth通过设置监听器来工作.您可以在App Delegate中监听现有用户,如下所示:

final class AppDelegate: UIResponder, UIApplicationDelegate {
    private let auth = FIRAuth.auth()

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        auth?.addStateDidChangeListener { [weak self] (_, user) in
            if let user = user {
                // user is already logged in
            } else {
                // user is not logged in
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)