Firebase 登录持久化 Swift

5
我将使用Firebase来处理我的应用程序的用户注册和登录。但是,如果我登录后完全关闭了我的应用程序,那么用户就被迫重新登录。我希望用户除非点击“注销”,否则保持登录状态。
我的登录代码如下:
        Auth.auth().signIn(withEmail: email, password: password, completion: {(user, error) in
            if let firebaseError = error {
                print(firebaseError.localizedDescription)
                return
            }
            self.presentTabBar()
        })
    }
}

如何让用户一直保持登录状态,除非明确退出登录?

3个回答

3

检查用户是否已登录:

if Auth.auth().currentUser != nil {
 // User is signed in.
 // ...
} else {
  // No user is signed in.
 // ...
}

如果用户已登录,则跳转到主页ViewController。这样,当他再次打开应用时,除非注销FIRAuth.auth().signOut(),否则他将进入主页ViewController

欲了解更多信息,请查看:https://firebase.google.com/docs/auth/ios/manage-users


那么我是将其放在我的登录视图控制器中,还是AppDelegate中,或者其他地方? - Eoghan Casey
1
在登录视图控制器之前创建一个视图控制器并将其放置在那里。这将是应用程序打开时的第一个视图控制器。这样它就会在开始时检查并转到正确的“视图控制器”。 - Peter Haddad

3

以下是一个方便的2020年全面示例:

在您的iOS+Firebase应用程序中的任何位置,您只需简单地说:

guard let uid = Auth.auth().currentUser?.uid else {
    return print("no current user!")
}

因此,在您的应用程序的启动屏幕上,只需要:
import UIKit
import Firebase
import FirebaseUI

class ViewController: UIViewController, FUIAuthDelegate {

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        guard let uid = Auth.auth().currentUser?.uid else {
            return print("no current user, hence AuthUI flow...")
            basicAuthUIFlow()
        }
        print("User .. \(Auth.auth().currentUser?.displayName)")
        continueWhenUserPresent()
    }

很简单。然后像往常一样...
    private func basicAuthUIFlow() {
        let authUI = FUIAuth.defaultAuthUI()
        authUI?.delegate = self
        let pp: [FUIAuthProvider] = [ FUIGoogleAuth() ]
        authUI?.providers = pp
        if let authVC = authUI?.authViewController() {
            present(authVC, animated: true)
        }
    }

    func authUI(_ authUI: FUIAuth,
      didSignInWith authDataResult: AuthDataResult?,url: URL?, error: Error?) {
        let u = authDataResult?.user
        print("Successful login via authUI \(String(describing: u?.displayName))")
        continueWhenUserPresent()
    }

    private func continueWhenUserPresent() {
        .. pushViewController .. your first screen
    }

2

为了保持用户登录状态,您需要检查currentUser Auth会话,如果它不是nil,则可以将用户重定向到主屏幕。

在FirebaseApp.configure()代码之后,在didFinishLaunchingWithOptions中调用“setRootViewController”方法。

Swift 4

    func setRootViewController() {
        if Auth.auth().currentUser != nil {
            // Set Your home view controller Here as root View Controller
            self.presentTabBar()
        } else {
            // Set you login view controller here as root view controller
        }
    }

嗨,我尝试着实现这个功能(抱歉回复晚了)。我的FirebaseApp.configure()在AppDelegate中。但是当我尝试声明我的presentTabBar()函数时,我收到一个错误,说AppDelegate没有成员present。我认为这是因为AppDelegate不是一个viewController。我能以另一种方式/ViewController实现吗? - Eoghan Casey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接