LoginSignup
15
18

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-03-05

はじめに

色々更新されてました!
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.

が出るため

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

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

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

——-ではさっそく: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'

一応見本写真
スクリーンショット 2020-01-10 0.33.19.png

コード変更箇所1

<前>

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])
    }

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

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

コード変更箇所2

<前>

GIDSignIn.sharedInstance().uiDelegate = self

<修正>

GIDSignIn.sharedInstance()?.presentingViewController = self

おまけ

ログインは,

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

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

以前書いた記事はここから

どうせ復習するならいっそ記事にしてしまえ!!そっちの方が復習に身も入るかな?っというだけのものです。

基本、いや全ては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]タップ

スクリーンショット 2019-03-05 22.08.38.png

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

スクリーンショット 2019-03-05 22.11.14.png
スクリーンショット 2019-03-05 22.11.30.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がドット区切りで逆さまにされているもの。以下参考程度に。

スクリーンショット 2019-03-05 22.40.26.png
スクリーンショット 2019-03-05 22.55.50.png

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

スクリーンショット 2019-03-05 22.46.37.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

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

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で指定したメソッドに情報が入っているのでそこで取得できます。

・全く違うボタンを使用して

ボタンを作成してタップで以下呼び出せばできます。

GIDSignIn.sharedInstance()?.signIn()

・忘れないように

ログアウト処理。

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

15
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
18