はじめに
色々更新されてました!
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()
}
——-ではさっそくここからは新しくなったバージョンの変更。下の方には以前のやり方を詳しく書いてます。
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'
コード変更箇所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的なの表示されないみたいです。。というか表示されないで先にデリゲートメソッドが呼ばれます。私はあまり使わなそうだなと思いました!
リファレンス読みたい方用のリンク↓
以前書いた記事はここから
どうせ復習するならいっそ記事にしてしまえ!!そっちの方が復習に身も入るかな?っというだけのものです。
基本、いや全てはGoogleさんのリンクさんから書いてあること書いていきます
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]タップ
![]() |
---|
色々聞かれるので適切に答えていきます。
最後のBudleIDは間違えないように写真のところを入力してください。
あ!ちなみにここでタップでGoogleService-Info.plistも保存できるので取得しといてください。あとで必要です。
![]() |
---|
![]() |
---|
最後に作成されたものを記述以下参考
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がドット区切りで逆さまにされているもの。以下参考程度に。
![]() |
---|
![]() |
---|
これを以下部分にコピーペースト。
![]() |
---|
・コード追記
//追記部分(デリゲートの設定(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として接続の部分)
で結果コードは以下の形に。
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()
・そのほか
受け取るところをログインボタンがあるところに書く方がデータ取りやすいと感じました。
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