iT邦幫忙

2021 iThome 鐵人賽

DAY 18
0
Mobile Development

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

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

  • 分享至 

  • xImage
  •  

昨天我們已經將前置作業,也就是 URL Types、AppDelegate.swift 完成了,今天我們要來把剩下的帳號登入以及帳號登出功能來實作完成

畫面設計

我們先在 Storyboard/Xib 上拉出一個 UIView,然後將他的 class 改為「GIDSignInButton」,然後再拉出一個 UIButton,用來帳號登出

兩個 Button 元件的 IBOutlet 如下

@IBOutlet weak var signInWithGoogleBtn: GIDSignInButton!
@IBOutlet weak var signOutBtn: UIButton!

Sign in with Google 功能實作

在 GIDSignInButton 這個 Button 的 IBAction 加入下面這段
我們透過 GIDSignIn 這個物件來進行 Google 帳號登入
首先,先宣告一個 clientID 常數,這個我們可以透過 Firebase 來取得
然後再宣告一個 config 常數,用來儲存 clientID 的資訊
然後就可以透過 GIDSignIn.sharedInstance.signIn() 來進行 Google 帳號登入
登入成功後,Google 會回傳使用者的 idToken 跟 accessToken
接著就可以用 GoogleAuthProivder.credential() 來產生該使用者的 Credential (憑證)
後面就可以透過這個憑證來與 Firebase 串接在一起了

@IBAction func signInWithGoogle(_ sender: Any) {
    self.signInWithGoogle()
}

// 登入帳號
func signInWithGoogle() {
    guard let clientID = FirebaseApp.app()?.options.clientID else { return }
    let config = GIDConfiguration(clientID: clientID) // 創建 Google Sign In Config 物件
    GIDSignIn.sharedInstance.signIn(with: config, presenting: self) { [unowned self] user, error in
        guard error == nil else {
            CustomFunc.customAlert(title: "", message: "\(String(describing: error!.localizedDescription))", vc: self, actionHandler: nil)
            return
        }
        guard let authentication = user?.authentication, let idToken = authentication.idToken else { return }
        let credential = GoogleAuthProvider.credential(withIDToken: idToken, accessToken: authentication.accessToken)
        self.firebaseSignInWithGoogle(credential: credential)
    }
}

// 將上面從 Google 登入後的資訊,告訴 Firebase
func firebaseSignInWithGoogle(credential: AuthCredential) {
    Auth.auth().signIn(with: credential) { authResult, 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)
    }
}

然後帳號登出的部分如下,直接透過 Firebase 提供的 signOut() API 和 GIDSignIn 提供的 signOut() API 就可以輕鬆實作了

@IBAction func googleAccountSignOut(_ sender: UIButton) {
    self.googleAccountSignOut()
}

// 登出帳號
func googleAccountSignOut() {
    do {
        try Auth.auth().signOut()
        GIDSignIn.sharedInstance.signOut()
        CustomFunc.customAlert(title: "帳號已登出!", message: "", vc: self, actionHandler: nil)
        self.isSignIn = false
    } catch let error as NSError {
        CustomFunc.customAlert(title: "", message: "\(String(describing: error.localizedDescription))", vc: self, actionHandler: nil)
    }
}

如果要取得已登入使用者的資訊,也很簡單,只要加入下面這段就可以了

// MARK: - Firebase 取得登入使用者的資訊
func getFirebaseUserInfo() {
    let currentUser = Auth.auth().currentUser
    guard let user = currentUser else {
        CustomFunc.customAlert(title: "使用者資訊", message: "無法取得使用者資料", vc: self, actionHandler: nil)
        return
    }
    let uid = user.uid
    let email = user.email
    let name = user.displayName
    CustomFunc.customAlert(title: "使用者資訊", message: "User Name:\(name!)\nUID:\(uid)\nEmail:\(email!)", vc: self, actionHandler: nil)
}

成果

Yes

本篇的範例程式碼:Github


上一篇
【在 iOS 開發路上的大小事-Day17】透過 Firebase 來管理使用者 (Sign in with Google 篇) Part1
下一篇
【在 iOS 開發路上的大小事-Day19】透過 Firebase 來管理使用者 (Sign in with Facebook 篇) Part1
系列文
在 iOS 開發路上的大小事30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言