2017-07-24 41 views
1

我有一個連接到Firebase的應用程序,您可以使用Google和Facebook登錄。該應用程序具有用戶登錄時加載的主屏幕。如果用戶之前已登錄,我不想顯示登錄屏幕。所以我用這個代碼在主屏幕,以檢查用戶是否登錄,主頁屏幕是在應用程序Swift - 這段代碼是否錯誤,或者我應該使用UserDefaults?

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方法中,所以代碼在視圖控制器出現。你知道解決方案嗎?

+0

我相信,Firebase使用此API下方的UserDefaults或CoreData。我用同樣的方式,從來沒有任何問題。 –

+0

是的,但唯一的問題是快速顯示主屏幕,然後在登錄屏幕上執行segue,我猜這是因爲它在viewdidApepar方法中,所以代碼在viewcontroller出現後執行。你知道解決方案嗎? –

+1

使用'viewWillAppear'可能會工作 –

回答

1

這就是我親自做的,在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 
} 

希望它可以幫助你。

+0

我應該在哪裏放置關於currentUser的第二個代碼段? –

+0

另外,你的第三個代碼段是在一個名爲UserManager的類中? –

+0

添加了他們所屬的文件作爲編輯。 – Velix007

相關問題