Edited at

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

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

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

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


・podでライブラリのインストール

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

pod 'GoogleSignIn'


・クライアントIDの作成、プロジェクトへ記入

https://developers.google.com/identity/sign-in/ios/start?ver=swift

からクライアントIDの作成

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

色々聞かれるので適切に答えていきます。

最後のBudleIDは間違えないように写真のところを入力してください。

あ!ちなみにここでタップでGoogleService-Info.plistも保存できるので取得しといてください。あとで必要です。

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


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がドット区切りで逆さまにされているもの。以下参考程度に。

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


・コード追記


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として接続の部分)

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


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