【Xcode/Swift】Firebase Authenticationを使ってGoogleのサインイン機能を実装する方法

この記事では、Firebaseを使ってGoogleのログイン機能を簡単に実装していきたいと思います。

こんな感じのログイン機能が作れます。

実装方法

STEP.1
Firebase登録

Firebaseの登録を行なっていない方は、以下の記事を参考にプロジェクトを登録してください。

【Xcode/Swift】Firebaseの導入の仕方・使い方〜アカウント作成から詳しく解説〜
STEP.2
Googleのログインを許可

まずは、Firebaseの方でGoogleログインを許可します。

①Authentivationをクリック
②始めるをクリック

Googleをクリック

STEP.3
Googleログイン設定

①有効にする
②サポートのメールアドレスを入力
③保存をクリック

STEP.4
ライブラリインストール

CocoaPodsで以下のライブラリを追加でインストールしてください。

pod 'Firebase/Auth'
pod 'GoogleSignIn'

CocoaPodsのやり方がわからない方は、こちら

【Xcode/Swift】CocoaPodsの使い方を徹底解説
STEP.5
URLスキーマ設定

①GoogleService-Info.plistを選択
②REVERSED_CLIENT_IDのValueをコピー

 ①プロジェクトを選択
②TERGETSを選択
③Infoを選択
④プラスボタンをクリック
⑤URL Schemesにペースト

STEP.5
import

AppDelegate.swiftにimportしましょう。

import GoogleSignIn

STEP.6
関数を追記

AppDelegate.swiftに以下の関数を追記してください。

func application(_ application: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any]) -> Bool {
    return GIDSignIn.sharedInstance.handle(url)
}

STEP.7
背景色変更

分かりやすいように背景色を適当な色に変更しておきます。

①Viewをクリック
Show (Show The Attributes inspector)をクリック
③Backgroundを適当な色に変更

STEP.8
Viewを配置

Viewを適当な場所に配置

STEP.9
クラスをつける

①Viewを選択
Show (Show The Identifier inspector)をクリック
③ClassでGIDSigninButtonを選択

STEP.10
紐付け

コードと2分割して紐付けましょう。

①NameにdidTapSoginButtonと入力
②EventをTouchUpInsideに変更
③Connectをクリック

STEP.11
import

ViewController.swiftにもimportしましょう。

import Firebase
import GoogleSignIn

STEP.12
ログインのコード

以下がログインのコードです。ViewController.swiftに貼り付けてください。

private func auth() {
    guard let clientID = FirebaseApp.app()?.options.clientID else { return }
    let config = GIDConfiguration(clientID: clientID)
    
    GIDSignIn.sharedInstance.signIn(with: config, presenting: self) { [unowned self] user, error in
        if let error = error {
            print("GIDSignInError: \(error.localizedDescription)")
            return
        }
        
        guard let authentication = user?.authentication,
              let idToken = authentication.idToken else { return }
        
        let credential = GoogleAuthProvider.credential(withIDToken: idToken, accessToken: authentication.accessToken)
        self.login(credential: credential)
    }
}

private func login(credential: AuthCredential) {
    print("ログイン完了")
}

STEP.13
ボタンを押したときにの処理

ボタンを押したときにauth()を呼びましょう。

STEP.14
実行して確認

実行して確認しましょう。Googleでログインできるようになっているはずです。

これでFirebaseで簡単にログイン機能が作れました。

import UIKit
import Firebase
import GoogleSignIn

@main
class AppDelegate: UIResponder, UIApplicationDelegate {
    
    
    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        FirebaseApp.configure()
        return true
    }
    
    // MARK: UISceneSession Lifecycle
    
    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        // Called when a new scene session is being created.
        // Use this method to select a configuration to create the new scene with.
        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    }
    
    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
        // Called when the user discards a scene session.
        // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
        // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
    }
    
    func application(_ application: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any]) -> Bool {
        return GIDSignIn.sharedInstance.handle(url)
    }
    
}
import UIKit
import Firebase
import GoogleSignIn

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
    
    @IBAction func didTappSignInButton(_ sender: Any) {
        auth()
    }
    
    private func auth() {
        guard let clientID = FirebaseApp.app()?.options.clientID else { return }
        let config = GIDConfiguration(clientID: clientID)
        
        GIDSignIn.sharedInstance.signIn(with: config, presenting: self) { [unowned self] user, error in
            if let error = error {
                print("GIDSignInError: \(error.localizedDescription)")
                return
            }
            
            guard let authentication = user?.authentication,
                  let idToken = authentication.idToken else { return }
            
            let credential = GoogleAuthProvider.credential(withIDToken: idToken, accessToken: authentication.accessToken)
            self.login(credential: credential)
        }
    }
    
    private func login(credential: AuthCredential) {
        print("ログイン完了")
    }
    
}