我有一个与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出现后执行。你知道解决方案吗?
答案 0 :(得分:1)
这是我个人做的,在AppDelegate中做了FininLaunchingWithOptions。
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
}
希望它对你有所帮助。