Google Sign-In for iOSのやり方を復習。

#はじめに
<font color=red>色々更新されてました！</font>
xocde11.3でswift5でってやろうとしたら、、、
ドキュメントみて、、、
更新されていました！
更新内容に関してのリンクは、
https://developers.google.com/identity/sign-in/ios/quick-migration-guide

```
Optional(Error Domain=com.google.GIDSignIn Code=-1 "The operation couldn’t be completed. (org.openid.appauth.general error -3.)" UserInfo={NSLocalizedDescription=The operation couldn’t be completed. (org.openid.appauth.general error -3.
```

が出るため

結局あげないで行いました。
あげないバージョンだと、
<font color=red>4.4.0</font>ですね！
<font color=red>**と書きましたが遅延処理をかけば問題なく行くことが判明しました！(°▽°)わ〜〜い。しっかりみるべきでした。**</font>

なのでログインするところはこんな感じになるかと、、、
私の場合ログイン前にサインアウト処理を念のため入れています。

```.swift
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
            GIDSignIn.sharedInstance()?.presentingViewController = self
            GIDSignIn.sharedInstance().delegate = self
            GIDSignIn.sharedInstance()?.signOut()
            GIDSignIn.sharedInstance()?.disconnect()
            GIDSignIn.sharedInstance()?.signIn()
        }
```

https://stackoverflow.com/a/58075863

——-ではさっそく:baby_chick:ここからは新しくなったバージョンの変更。下の方には以前のやり方を詳しく書いてます。

###pod記述変更した方がいいかもです。で再インストール
iOS13以上でサインインがおかしいの修正したとのことで5.0.1以上入れるようにした方がいいと思いました！`pod update GoogleSignIn`見たいのもありますし、一度podfileの記述場所消して`pod install`でライブラリ削除、追記して`pod install`みたいに入れる方法もあるかと思います。
https://developers.google.com/identity/sign-in/ios/release

```
pod 'GoogleSignIn', '~> 5.0'
```

一応見本写真
<img width="300" alt="スクリーンショット 2020-01-10 0.33.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133940/2d421460-1184-555c-ba81-9f6960fd09e8.png">


###コード変更箇所1
<前>

```.swift
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        return GIDSignIn.sharedInstance().handle(url as URL?,
                                                 sourceApplication: options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String,
                                                 annotation: options[UIApplication.OpenURLOptionsKey.annotation])
    }
```

<修正>書くのが少なくなりました！

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

###コード変更箇所2

<前>

```.swift
GIDSignIn.sharedInstance().uiDelegate = self
```

<修正>

```.swift
GIDSignIn.sharedInstance()?.presentingViewController = self
```

###おまけ

ログインは,

`GIDSignIn.sharedInstance()?.signIn()`も`GIDSignIn.sharedInstance()?.restorePreviousSignIn()()`もできるけど、後者は一度ログインするとログインのためのWebView的なの表示されないみたいです。。というか表示されないで先にデリゲートメソッドが呼ばれます。私はあまり使わなそうだなと思いました！

:sunny:リファレンス読みたい方用のリンク↓

https://developers.google.com/identity/sign-in/ios/reference/Classes/GIDSignIn#-restoreprevioussignin

https://developers.google.com/identity/sign-in/ios/reference/Classes/GIDSignIn#-signin


#以前書いた記事はここから
どうせ復習するならいっそ記事にしてしまえ！！そっちの方が復習に身も入るかな？っというだけのものです。

基本、いや全てはGoogleさんのリンクさんから書いてあること書いていきます:flushed:

https://developers.google.com/identity/sign-in/ios/
や
https://developers.google.com/identity/sign-in/ios/start-integrating

###・podでライブラリのインストール
podでのインストールは沢山あるかと思うので、ここではpodfileの記述のみとさせていただきます。

```
pod 'GoogleSignIn'
```

###・クライアントIDの作成、プロジェクトへ記入
https://developers.google.com/identity/sign-in/ios/start?ver=swift
からクライアントIDの作成

**作るにあたってあの水色ボタン[CREATE AN OAUTH CLIENT ID]タップ**

|<img width="764" alt="スクリーンショット 2019-03-05 22.08.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/353174f4-c015-04f4-80ec-a8530511f759.png">|
|:-----------------|

色々聞かれるので適切に答えていきます。
最後のBudleIDは間違えないように写真のところを入力してください。
あ！ちなみにここでタップで**GoogleService-Info.plist**も保存できるので取得しといてください。あとで必要です。

|<img width="685" alt="スクリーンショット 2019-03-05 22.11.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/bce96155-aa3b-33ac-89fc-d4ed36d61839.png">|
|:-----------------|

|<img width="620" alt="スクリーンショット 2019-03-05 22.11.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/fc0672aa-69a6-7017-9515-8ef5c7dd257f.png">|
|:-----------------|

最後に作成されたものを記述以下参考

```AppDelegate.swift
import UIKit
import GoogleSignIn //⇦追記部分

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        GIDSignIn.sharedInstance().clientID = "ここに上記で取得したクライアントID"//⇦追記部分
        return true
}
```

###・スキームの登録
これはアプリを開く時に必要なものです。この設定があると外部が指定したurlでアプリをひらけます。
では設定を。
まず先ほどインストールしておいた**GoogleService-Info.plist**のREVERSED_CLIENT_IDに注目。ちなみに、これは先ほどのクライアントIDがドット区切りで逆さまにされているもの。以下参考程度に。

|<img width="285" alt="スクリーンショット 2019-03-05 22.40.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/a7771bdd-166a-efd7-b6b4-0ffe5e4f93ea.png">|
|:-----------------|

|<img width="475" alt="スクリーンショット 2019-03-05 22.55.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/616f430f-04a4-0e18-e76d-2c3e610ef282.png">|
|:-----------------|

これを以下部分にコピーペースト。

|<img width="1232" alt="スクリーンショット 2019-03-05 22.46.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/246f362d-687b-65d2-9d88-161e1d7ada48.png">|
|:-----------------|

###・コード追記

```AppDelegate.swift
//追記部分(デリゲートの設定(GIDSignInDelegateのところ))
class AppDelegate: UIResponder, UIApplicationDelegate, GIDSignInDelegate  {
    
    //追記部分(デリゲートメソッド)
    func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) {
            if let error = error {
                print("\(error.localizedDescription)")
            } else {
                // Perform any operations on signed in user here.
                let userId = user.userID                  // For client-side use only!
                let idToken = user.authentication.idToken // Safe to send to the server
                let fullName = user.profile.name
                let givenName = user.profile.givenName
                let familyName = user.profile.familyName
                let email = user.profile.email
            }
    }
    
    //追記部分(デリゲートメソッド)エラー来た時
    func sign(_ signIn: GIDSignIn!, didDisconnectWith user: GIDGoogleUser!,
              withError error: Error!) {
        print(error.localizedDescription)
    }

    var window: UIWindow?

    //追記部分(プリケーションが受け取るURLを正しく処理するのに必要らしい)
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        GIDSignIn.sharedInstance().clientID = "取得したクライアントID"
        GIDSignIn.sharedInstance()?.delegate = self
        return true
    }
    
    func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
        return GIDSignIn.sharedInstance().handle(url as URL?,
                                                 sourceApplication: options[UIApplication.OpenURLOptionsKey.sourceApplication] as? String,
                                                 annotation: options[UIApplication.OpenURLOptionsKey.annotation])
    }

```

###・ログインボタン配置したい場所で
もともとあるもの使う場合、GoogleさんオリジナルGIDSignInButtonを使います。
ストーリーボードの参考は動画の方がわかりやすいと思ったので動画のみ乗せておきます。(viewを配置してそれをGIDSignInButtonとして接続の部分)
![googlebutton2.gif](https://qiita-image-store.s3.amazonaws.com/0/133940/a4503c80-9b67-5a64-33c2-6df986cadf73.gif)


で結果コードは以下の形に。

```ViewController.swift
import UIKit
import GoogleSignIn

class ViewController: UIViewController, GIDSignInUIDelegate {

    @IBOutlet weak var button: GIDSignInButton!
    override func viewDidLoad() {
        super.viewDidLoad()
        GIDSignIn.sharedInstance().uiDelegate = self
    }
}
```

あとは表示されているボタンを押せば上記AppDelegate.swiftで指定したメソッドに情報が入っているのでそこで取得できます。


###・全く違うボタンを使用して
ボタンを作成してタップで以下呼び出せばできます。

```.swift
GIDSignIn.sharedInstance()?.signIn()
```

###・忘れないように
ログアウト処理。

```.swift
GIDSignIn.sharedInstance()?.signOut()
```

###・そのほか
受け取るところをログインボタンがあるところに書く方がデータ取りやすいと感じました。

```ViewController.swift
import UIKit
import GoogleSignIn

class ViewController: UIViewController, GIDSignInUIDelegate, GIDSignInDelegate {

    @IBOutlet weak var button: GIDSignInButton!
    override func viewDidLoad() {
        super.viewDidLoad()
        
        GIDSignIn.sharedInstance().uiDelegate = self
        GIDSignIn.sharedInstance()?.delegate = self
        
    }
    @IBAction func tap(_ sender: Any) {
        GIDSignIn.sharedInstance()?.signIn()
    }
    
    func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) {
        if let error = error {
            print("\(error.localizedDescription)")
        } else {
            // Perform any operations on signed in user here.
            let userId = user.userID                  // For client-side use only!
            let idToken = user.authentication.idToken // Safe to send to the server
            let fullName = user.profile.name
            let givenName = user.profile.givenName
            let familyName = user.profile.familyName
            let email = user.profile.email
        }
    }
    
    //追記部分(デリゲートメソッド)エラー来た時
    func sign(_ signIn: GIDSignIn!, didDisconnectWith user: GIDGoogleUser!,
              withError error: Error!) {
        print(error.localizedDescription)
    }
}
```

こういう書き方で説明しない理由がきになるのだけど。



#最後に
なぜか家では普通に実装ができるのどうにかしたい(o*｡_｡。)o
少し眠くなると思考回路悪くなりすぎるのどうにしたい(o*｡_｡。)o