iOSアプリでFirebaseによるGoogleサインインの実装方法（初心者向け）

# 記事作成のきっかけ

新たに作成したiOSアプリにFirebaseによるGoogleサインインの実装をするにあたり、以前作成していたiOSのアプリで実装していた内容をそのまま移行しようとしたがうまくいかず、あらためて[Firebaseのドキュメント](https://firebase.google.com/docs/auth/ios/google-signin?authuser=0#swift_5)に基づいて実装をすることにしました。

ドキュメントを見てもよくわからないという方が対象です。正しく実装するにはドキュメントを参照いただくのが最も正しいやり方となります。エラーハンドリングはかなり割愛しています。ご注意ください😇

以前参照した記事の通りに実装しているつもりが、エラーメッセージが出力される状態でした。
Firebaseのドキュメント通りに実装している記事が見当たらなかったためこちらに投稿することにしました。
どなたかのお役に立てれば幸いです。  

##環境
・M1 Mac
・Xcode 13.1
・Swift 5
・実装日 2021/11/20

## 実装手順
１.Firebaseにプロジェクトを作成する。
２.Xcodeで新たなプロジェクトを作成する。
３.Googleサインインするための設定を行う。
４.XcodeにFirebaseからダウンロードしたファイルをセットする。
５.サインインの実装を行う。

## やっていきましょう
### １.Firebaseにプロジェクトを作成します。
Firebaseのアカウント作成は[こちら](https://firebase.google.com/ "Firebase Home")から。

Firebaseのコンソールに移動したら、以下のプロジェクトを追加ボタンからプロジェクトを作成します。

![スクリーンショット 2021-11-20 21.31.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246652/e10687c5-d2d5-b4b7-c564-4fe048fd0199.png)

プロジェクト名を決めます。
GoogleSignInにしてみました。

Googleアナリティクスはオフで。
プロジェクトを作成ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246652/39e5f55d-f85a-87f5-d40e-f4e6c41c3756.png)

10秒ほどでプロジェクトが作られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246652/81dade00-d43c-34d5-2d59-e2ea4b4e80a5.png)


### ２.Xcodeで新たなプロジェクトを作成する。
ここではSignInとでもしておきます。
(GoogleSignInでは、モジュールの名前とプロジェクトの名前がかぶってしまいNG)

pod ファイルを作成します。
CocoaPodsの導入が必要となりますので、[こちらの記事](https://qiita.com/ShinokiRyosei/items/3090290cb72434852460)を参照していただくのがいいでしょう。
ターミナルを利用して、SignInのディレクトリで以下のコマンドを実行していきます。


```
$ pod init 
```

Podfileが作られました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246652/4dcf0af3-f5d5-a8da-b0a8-6a386e0e3fc0.png)

以下のように編集しましょう。
    pod 'Firebase/Auth'
    pod 'GoogleSignIn'
を追加するだけですね。

```
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'SignIn' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # Pods for SignIn
	pod 'Firebase/Auth'
	pod 'GoogleSignIn'

  target 'SignInTests' do
    inherit! :search_paths
    # Pods for testing
  end

  target 'SignInUITests' do
    # Pods for testing
  end

end
```

インストールします。

```
$ pod install
```

こんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246652/a17e4e8c-9250-470a-8bdc-bccd6a50c43f.png)

続いて、SignIn.scworkspaceファイルをダブルクリックして、プロジェクトを開きます。


プロジェクトファイルからBundle Identifireをコピーしておきます。
この画像では「com.hogehoge.SignIn」となっていますが、各自の環境のものをコピーしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246652/d20f0ac1-e0ad-7735-e397-45209f650078.png)

プロジェクトの作成はここまでです。
では、Firebaseのコンソールに戻りましょう。


### ３.Googleサインインするための設定を行う。
iOS+のボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246652/1d2da84b-ed6e-ab73-c07d-e4b8a502bf1c.png)

さきほどコピーしたBundle Identifireを貼り付けて、FirebaseとXcodeのプログラムを紐づけます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246652/edd05c9e-8c3b-4ccc-3429-279333624471.png)

アプリを登録ボタンをクリックします。

GoogleService-Info.plistをダウンロードボタンでファイルをダウンロードします。
一旦どこか適当なフォルダに保存しておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246652/5c453539-ea10-a685-13de-aeb43ff5c744.png)

3のFirabase SDKの追加は何もせず次へ。

４.初期化コードの追加を後でしますので、ここでは次へで大丈夫です。

５.でコンソールに進むをクリックしましょう。

コンソールのトップページに着いたら、左のメニューのAuthenticationをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246652/a93d5ba1-066f-622e-53e3-15a14f365e99.png)

始めるボタンをクリックしましょう。

追加のプロバイダでGoogleを選択ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246652/3488016e-4ae2-7347-f672-6f9d3476f757.png)

右上の有効にするをクリックします。
プロジェクトの公開名はデフォルト値がセットされているので、変更の必要はありません。
メールアドレスを設定しましょう。
Googleアカウントのメールアドレスが選択できると思います。
保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246652/9b8765b9-edb5-72f3-0895-54e9466f4b5e.png)

設定はこれでOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246652/b54ff65d-6384-33e4-05ab-3cc83b2cee42.png)

では、Xcodeに戻りましょう。

### ４.XcodeにFirebaseからダウンロードしたファイルをセットする。

GoogleService-Info.plistをドラッグして、SignIn/SignInのフォルダにドロップします。
すると、以下の画面となりますので、同様のチェック状態にしてFinishボタンをクリックしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246652/d1a14137-e199-1274-f9b9-9c0a44d43c67.png)

置く場所はここです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246652/2fa63b67-194b-41bc-e5e3-f32cae8b7cdf.png)

GoogleService-Info.plistを選択して、REVERSED_CLIENT_IDのValueをコピーします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246652/79530ba5-d89a-a685-7f49-afff4dc413f2.png)


左のファイルリストからSignInを選択して、Infoのタブを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246652/2fde048d-bc09-d36b-9788-32d488b01f8f.png)

URL Types(0)をクリックしましょう。画像は(1)となっていますが。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246652/2215bd52-f8fa-1d13-5be1-8ab1f6624bb8.png)

+ボタンで追加です。
URL SchemesにREVERSED_CLIENT_IDのValueを貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246652/db26f028-8c67-baae-d4ec-c2c7d2aaebf6.png)


### ５.サインインの実装を行う。
AppDelegate.swiftを以下のように編集します。
Firebaseをインポートして、初期化コードを記述します。
（FirebaseApp.configure()）です。
先ほどコンソールの設定で後で説明するとした部分です。

```
import UIKit
import Firebase

@main
class AppDelegate: UIResponder, UIApplicationDelegate {



    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        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.
    }


}
```
では、画面にボタンを設置しましょう。

Main.storyboardの右上の＋ボタンでボタンを選択して、ドラッグアンドドロップですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246652/8df426f7-7722-1d94-33e4-543b279d8ca9.png)

storyboardとViewController.swiftを並べて表示し、Ctrlを押しながらドラッグアンドドロップでViewController.swiftにButtonを関連づけます。
ボタンの名前はGoogleSignInButtonとしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246652/edfe5cf6-7daa-155f-ada4-91c388ed14a4.png)

デザインはここでは触れませんが、お好みに調整してみてください。

以下のようにViewControllerを編集します。

```
import UIKit
import Firebase
import FirebaseAuth
import GoogleSignIn

class ViewController: UIViewController {

    // 設置したボタンを関連づけ
    @IBOutlet weak var GoogleSignInButton: UIButton!
    override func viewDidLoad() {
        super.viewDidLoad()
        // ボタンをタップした時のアクションを指定。SignInファンクションを呼び出すよ。
        GoogleSignInButton.addTarget(self, action: #selector(SignIn), for: .touchUpInside)
    }

    // サインインを行います。
    @objc func SignIn() {
        print("サインインします。")
        guard let clientID = FirebaseApp.app()?.options.clientID else { return }
        
        // Create Google Sign In configuration object.
        let config = GIDConfiguration(clientID: clientID)
        
        // Start the sign in flow!
        GIDSignIn.sharedInstance.signIn(with: config, presenting: self) { [unowned self] user, error in
            if let error = error {
                print(error)
                return
            }
            guard
                let authentication = user?.authentication,
                let idToken = authentication.idToken
            else {
                return
            }
            let credential = GoogleAuthProvider.credential(withIDToken: idToken,
                                                           accessToken: authentication.accessToken)
            Auth.auth().signIn(with: credential) { authResult, error in
                if let error = error {
                    let authError = error as NSError
                    print(authError)
                    return
                }
                print("Googoleアカウントでサインしました。")
            }
        }
    }
}
```


ビルドします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246652/709db2d6-3b9d-7745-88fb-28841712c2ba.png)


Buttonの部分をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246652/f9d9569c-b7d3-eaa0-7f6a-86a9c793a8fa.png)

Continueで実際のGoogleアカウントでログインしてみてください。

ログインができれば、Xcodeの下部に表示されるログにサインインが成功した表示が出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246652/0884ba6b-1b1c-00c9-3788-de831ae5acb4.png)

また、FirebaseのコンソールのAuthenticationにもサインインしたアカウント情報が表示されます。

これで、完成です。
お疲れ様でした。