iT邦幫忙

2021 iThome 鐵人賽

DAY 16
0
Mobile Development

在 iOS 開發路上的大小事系列 第 16

【在 iOS 開發路上的大小事-Day16】透過 Firebase 來管理使用者 (Sign in with E-mail 篇) Part2

昨天我們已經將註冊帳號、帳號登入實作完成了,今天我們要來把剩下的帳號登出以及密碼重設功能來實作完成

這是我們昨天完成的帳號登入功能

@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


上一篇
【在 iOS 開發路上的大小事-Day15】透過 Firebase 來管理使用者 (Sign in with E-mail 篇) Part1
下一篇
【在 iOS 開發路上的大小事-Day17】透過 Firebase 來管理使用者 (Sign in with Google 篇) Part1
系列文
在 iOS 開發路上的大小事30

尚未有邦友留言

立即登入留言