如何使用Firebase最好地处理电子邮件和密码身份验证 - Swift

时间:2016-08-26 12:13:56

标签: swift firebase-authentication keychain

我有一个包含三个按钮的登录页面:logInOutlet, logOutOutlet, bookingsOutlet。 如果用户已登录,则显示logOut和预订,并隐藏logIn。相反,如果用户退出,请隐藏:logOut按钮&预订按钮,显示:登录按钮。 根据当前用户的登录状态,我想显示/隐藏某些按钮。

    1. 最初,我考虑检查当前用户是否有.uid值(表示用户已登录),否则,如果FIRAuth.auth()?.currentUser?.uid == nil,则用户未登录并执行某些操作。 事实证明我错了,因为FIRAuth.auth()?.currentUser?.uid将始终返回有效的uid值,即使用户已注销。 “Firebase身份验证会话将保留在iOS钥匙串中的用户设备上。” - 我对keychain数据持久性知之甚少。
    1. 另一种选择是在用户登录时将.uid保存在NSUserDefaults中。 如果用户注销,请从NSUserDefaults中删除键/值对。接下来,当我在模拟器中停止应用程序(进入后台模式)时,登录会话不再有效,因此当在前台模式下再次启动应用程序时,在viewDidLoad中我应该检查NSUserDefaults中是否存在键/值对对于.uid值,如果有,则执行操作以记录用户并显示/隐藏某些按钮。

我想知道在用户点击logOutOutlet按钮之前是否有更好的方法可以使logIn会话保持活动状态。我必须提到用户可以从应用程序中的不同viewControllers登录。我在第1点解释的初始假设似乎是一个可行的选择,因为Firebase总能处理大部分工作。

 @IBAction func logOut(sender: AnyObject) {

    // if the current user is logged in, try to log out and 
    // hide: logOut button & bookings button
    // show: logIn button
  //  if FIRAuth.auth()?.currentUser?.uid != nil {

        do {
            try FIRAuth.auth()?.signOut()

        } catch let error as NSError {
            print(error.localizedDescription)
             print("the current user id is \(FIRAuth.auth()?.currentUser?.uid)")
        }

        self.logInOutlet.hidden = false
        self.logOutOutlet.hidden = true
        self.bookingsOutlet.hidden = true

       // FullData.finalemailAddress = FIRAuth.auth()?.currentUser?.email
        FullData.finalemailAddress = nil

    } // end of if.. FIRAuth.auth()

}


   override func viewDidLoad() {
    super.viewDidLoad()

    // if the user is logged out
    // hide: logOut button & bookings button
    // show: logIn button
     // if FIRAuth.auth()?.currentUser?.uid == nil {

        self.logInOutlet.hidden = false
        self.logOutOutlet.hidden = true
        self.bookingsOutlet.hidden = true


        // if the user is logged in
        // hide: logIn Button
        // show: logOut button & bookings button
    } else if

        //FIRAuth.auth()?.currentUser?.uid != nil{

        self.logInOutlet.hidden = true
        self.logOutOutlet.hidden = false
        self.bookingsOutlet.hidden = false

        print("Great \(FullData.finalemailAddress)")
        print("Super \(FIRAuth.auth()?.currentUser?.uid)")
    }

}

0 个答案:

没有答案