我有一个连接到 Firebase 的应用程序,您可以使用 Google 和 Facebook 登录。该应用程序有一个主屏幕,在用户登录时加载。如果用户之前已经登录,我不想显示登录屏幕。所以我在主屏幕中使用此代码来检查用户是否已登录。主屏幕是应用程序中的初始视图控制器
override func viewDidAppear(_ animated: Bool) {
if Auth.auth().currentUser != nil{
// user is signed in
}else{
// No user is signed in.
performSegue(withIdentifier: "login", sender: nil)
}
}
这段代码工作得很好。我知道,我也可以使用 UserDefaults,但这似乎是一种更简单的方法。这是错误的还是我应该使用 UserDefaults?
但唯一的问题是,在短时间内显示主屏幕,然后对登录屏幕执行 segue,我猜这是因为它在 viewdidApepar 方法中,所以代码在 viewcontroller 出现后执行。你知道解决方法吗?
这就是我个人所做的,AppDelegate 中的 didFinishLaunchingWithOptions。
if UserManager.sharedManager.currentUser != nil {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
let viewController = storyboard.instantiateInitialViewController()
appDelegate.window?.rootViewController = viewController
} else {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let storyboard = UIStoryboard(name: "Login", bundle: Bundle.main)
let viewController = storyboard.instantiateInitialViewController()
appDelegate.window?.rootViewController = viewController
}
当然,我有一个 UserManager 来处理用户是否登录。 (UserManager:NSObject)
var currentUser: User? {
return User.unarchiveStoredUser()
}
用户与解码器一起存储到 UserDefautls 中,然后取消存档以验证用户是否已登录(用户:NSObject)
func archiveUser() {
let data = NSKeyedArchiver.archivedData(withRootObject: self)
UserDefaults.standard.set(data, forKey: "userIdentifier")
UserDefaults.standard.synchronize()
}
class func unarchiveStoredUser() -> User? {
if let data = UserDefaults.standard.object(forKey: "userIdentifier") as? Data {
let user = NSKeyedUnarchiver.unarchiveObject(with: data) as! User
return user
}
return nil
}
希望对你有帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句