昨天我們已經將註冊帳號、帳號登入實作完成了,今天我們要來把剩下的帳號登出以及密碼重設功能來實作完成
@IBAction func accountSignInOrSignOut(_ sender: UIButton) {
if (Auth.auth().currentUser == nil || !isSignIn) {
// 無用戶登入
if (accountTF.text == "" || passwordTF.text == "") {
CustomFunc.customAlert(title: "請重新輸入帳號密碼!", message: "", vc: self, actionHandler: nil)
} else {
Auth.auth().signIn(withEmail:accountTF.text!, password: passwordTF.text!) { (user, error) in
guard error == nil else {
CustomFunc.customAlert(title: "", message: "\(String(describing: error!.localizedDescription))", vc: self, actionHandler: nil)
return
}
CustomFunc.customAlert(title: "登入成功!", message: "", vc: self, actionHandler: self.getFirebaseUserInfo)
self.accountTF.text = ""
self.passwordTF.text = ""
self.isSignIn = true
self.signInOrSignOutBtn.setTitle("帳號登出", for: .normal)
}
}
} else {
// 有用戶登入
// 登出功能,下一篇才會教喔!
}
}
今天我們要來繼續把帳號登出也就是 else 的部分完成
在 else 裡面加入下面這段,透過 Firebase 提供的 signOut() API,我們可以很輕鬆的實作帳號登出功能
// 有用戶登入
do {
try Auth.auth().signOut()
CustomFunc.customAlert(title: "登出成功!", message: "", vc: self, actionHandler: nil)
self.accountTF.text = ""
self.passwordTF.text = ""
self.isSignIn = false
self.signInOrSignOutBtn.setTitle("帳號登入", for: .normal)
} catch let error as NSError {
CustomFunc.customAlert(title: "", message: "\(String(describing: error.localizedDescription))", vc: self, actionHandler: nil)
}
接著是密碼重設功能,在密碼重設按鈕的 IBAction 加入下面這段
透過 Firebase 提供的 sendPasswordReset() API,我們可以很輕鬆的實作密碼重設功能
@IBAction func resetPassword(_ sender: UIButton) {
if (accountTF.text == "") {
CustomFunc.customAlert(title: "", message: "請輸入要重設密碼的 Email!", vc: self, actionHandler: nil)
} else {
Auth.auth().sendPasswordReset(withEmail: accountTF.text!, completion: { (error) in
guard error == nil else {
CustomFunc.customAlert(title: "", message: "\(String(describing: error!.localizedDescription))", vc: self, actionHandler: nil)
return
}
CustomFunc.customAlert(title: "", message: "重設密碼的連結已寄到信箱內,請點擊信中的連結進行密碼重設!", vc: self, actionHandler: nil)
})
}
}
密碼重設的信件如下圖
密碼重設的畫面如下圖
再來是我們要如何知道,目前是否有使用者登入,我們可以透過加入帳號狀態監聽的方式來達成
先宣告一個變數 handle,型別為「AuthStateDidChangeListenerHandle?」,因為在沒有使用者的狀態下會為 nil,所以在型別的後面要加個「?」來告知說,此變數有可能會有空值的狀況
var handle: AuthStateDidChangeListenerHandle?
然後在 viewWillAppear 裡面加入帳號狀態監聽的 Function,當畫面將要出現的時候,就開始監聽
// MARK: - 加入 Firebase 帳號狀態監聽
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
handle = Auth.auth().addStateDidChangeListener { auth, user in
if (user != nil) {
if (self.isSignIn) {
print("目前已有使用者登入!")
self.signInOrSignOutBtn.setTitle("帳號登出", for: .normal)
self.passwordTF.isEnabled = false
} else {
self.signInOrSignOutBtn.setTitle("帳號登入", for: .normal)
self.passwordTF.isEnabled = true
}
} else {
// 目前尚無用戶登入
print("目前尚無用戶登入!")
}
}
}
接著在 viewWillDisappear 裡面加入帳號狀態監聽移除的 Function,當畫面將要消失的時候,就移除監聽
// MARK: - 移除 Firebase 帳號狀態監聽
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
Auth.auth().removeStateDidChangeListener(handle!)
}
後面兩篇要來教大家,如何透過 Firebase 來實作第三方帳號登入功能
本篇的參考範例程式碼:Github