昨天我們已經將前置作業,也就是 URL Types、AppDelegate.swift 完成了,今天我們要來把剩下的帳號登入以及帳號登出功能來實作完成
我們先在 Storyboard/Xib 上拉出一個 UIView,然後將他的 class 改為「GIDSignInButton」,然後再拉出一個 UIButton,用來帳號登出
兩個 Button 元件的 IBOutlet 如下
@IBOutlet weak var signInWithGoogleBtn: GIDSignInButton!
@IBOutlet weak var signOutBtn: UIButton!
在 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)
}
本篇的範例程式碼:Github