このページでは、iOS または macOS アプリに Google ログインを統合する方法について説明します。アプリのライフサイクルや UI モデルに合わせて、これらの手順を調整する必要がある場合があります。
始める前に
依存関係をダウンロードし、Xcode プロジェクトを構成して、クライアント ID を設定します。
iOS と macOS のサンプルアプリを試して、ログインの仕組みを確認する。
1. 認証リダイレクト URL を処理する
ユーザーが Google で認証されると、認証フローは、ユーザーの ID トークンを含む認証レスポンスを含む URL を使用してアプリにリダイレクトされます。この URL を GIDSignIn に渡すと、SDK はレスポンスを解析して、ユーザーの認証情報をアプリに返します。
iOS: UIApplicationDelegate
AppDelegate の application:openURL:options メソッドで、GIDSignIn の handleURL: メソッドを呼び出します。
Swift
func application(
_ app: UIApplication,
open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]
) -> Bool {
var handled: Bool
handled = GIDSignIn.sharedInstance.handle(url)
if handled {
return true
}
// Handle other custom URL types.
// If not handled by this app, return false.
return false
}
Objective-C
- (BOOL)application:(UIApplication *)app
openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
BOOL handled;
handled = [GIDSignIn.sharedInstance handleURL:url];
if (handled) {
return YES;
}
// Handle other custom URL types.
// If not handled by this app, return NO.
return NO;
}
macOS: NSApplicationDelegate
アプリの AppDelegate で、
applicationDidFinishLaunchingのkAEGetURLイベントのハンドラを登録します。Swift
func applicationDidFinishLaunching(_ notification: Notification) { // Register for GetURL events. let appleEventManager = NSAppleEventManager.shared() appleEventManager.setEventHandler( self, andSelector: "handleGetURLEvent:replyEvent:", forEventClass: AEEventClass(kInternetEventClass), andEventID: AEEventID(kAEGetURL) ) }Objective-C
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { // Register for GetURL events. NSAppleEventManager *appleEventManager = [NSAppleEventManager sharedAppleEventManager]; [appleEventManager setEventHandler:self andSelector:@selector(handleGetURLEvent:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL]; }GIDSignInのhandleURLを呼び出すこれらのイベントのハンドラを定義します。Swift
func handleGetURLEvent(event: NSAppleEventDescriptor?, replyEvent: NSAppleEventDescriptor?) { if let urlString = event?.paramDescriptor(forKeyword: AEKeyword(keyDirectObject))?.stringValue{ let url = NSURL(string: urlString) GIDSignIn.sharedInstance.handle(url) } }Objective-C
- (void)handleGetURLEvent:(NSAppleEventDescriptor *)event withReplyEvent:(NSAppleEventDescriptor *)replyEvent { NSString *URLString = [[event paramDescriptorForKeyword:keyDirectObject] stringValue]; NSURL *URL = [NSURL URLWithString:URLString]; [GIDSignIn.sharedInstance handleURL:url]; }
SwiftUI
アプリのウィンドウまたはシーンで、URL を受信するハンドラを登録し、GIDSignIn の handleURL を呼び出します。
Swift
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
// ...
.onOpenURL { url in
GIDSignIn.sharedInstance.handle(url)
}
}
}
}
2. ユーザーのログイン状態の復元を試みます
アプリの起動時に restorePreviousSignInWithCallback を呼び出して、Google を使用してすでにログインしているユーザーのログイン状態の復元を試みます。これにより、ユーザーはアプリを開くたびにログインする必要がなくなります(ログアウトした場合を除く)。
iOS アプリでは UIApplicationDelegate の application:didFinishLaunchingWithOptions: メソッドで、macOS アプリでは NSApplicationDelegate の applicationDidFinishLaunching: で、この処理を行うことがよくあります。この結果を使用して、ユーザーに表示するビューを決定します。次に例を示します。
Swift
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GIDSignIn.sharedInstance.restorePreviousSignIn { user, error in
if error != nil || user == nil {
// Show the app's signed-out state.
} else {
// Show the app's signed-in state.
}
}
return true
}
Objective-C
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[GIDSignIn.sharedInstance restorePreviousSignInWithCompletion:^(GIDGoogleUser * _Nullable user,
NSError * _Nullable error) {
if (error) {
// Show the app's signed-out state.
} else {
// Show the app's signed-in state.
}
}];
return YES;
}
SwiftUI
SwiftUI を使用している場合は、初期ビューの onAppear で restorePreviousSignIn の呼び出しを追加します。
Swift
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
// ...
.onAppear {
GIDSignIn.sharedInstance.restorePreviousSignIn { user, error in
// Check if `user` exists; otherwise, do something with `error`
}
}
}
}
}
3. Google ログインボタンを追加する
ログインビューに [Google でログイン] ボタンを追加します。Google のブランディング ガイドラインに準拠したボタンを自動的に生成する SwiftUI と UIKit 用のコンポーネントが用意されています。
SwiftUI の使用
プロジェクトに SwiftUI の [Google でログイン] ボタンの依存関係が追加されていることを確認します。
SwiftUI ボタンを追加するファイルで、必要な import をファイルの先頭に追加します。
import GoogleSignInSwiftUIApplication拡張機能を追加して、プレゼンテーション用のアクティブなルートビュー コントローラを取得します。extension UIApplication { // Minimal implementation to retrieve the active root view // controller for presentation. Apps presenting sign-in from deeper // within an existing view hierarchy should ensure they select the // appropriate view controller. var rootViewController: UIViewController? { let windowScene = connectedScenes .compactMap { scene in scene as? UIWindowScene } .first { scene in scene.activationState == .foregroundActive } return windowScene?.windows.first(where: { window in window.isKeyWindow })?.rootViewController } }View に [Google でログイン] ボタンを追加し、ボタンが押されたときに呼び出されるアクションを指定します。
GoogleSignInButton(action: handleSignInButton)ボタンが押されたときにログイン プロセスをトリガーするには、アクションで
GIDSignInのsignIn(withPresenting:completion:)メソッドの呼び出しを追加します。func handleSignInButton() { guard let rootViewController = UIApplication.shared.rootViewController else { // Handle error return } GIDSignIn.sharedInstance.signIn(withPresenting: rootViewController) { signInResult, error in guard let result = signInResult else { // Inspect error return } // If sign in succeeded, display the app's main content view. } }
これは、ボタンの標準のスタイル設定情報を提供するデフォルトのビューモデルを使用します。ボタンの外観を制御するには、カスタム GoogleSignInButtonViewModel を作成し、GoogleSignInButton(viewModel: yourViewModel, action:
yourAction) を使用してボタンのイニシャライザで viewModel として設定する必要があります。詳細については、GoogleSignInButtonViewModel ソースコードをご覧ください。
UIKit の使用
ログイン View に [Google でログイン] ボタンを追加します。
GIDSignInButtonクラスを使用すると、Google のブランド設定がされたボタンを自動的に生成する(推奨)か、カスタム スタイルで独自のボタンを作成できます。GIDSignInButtonをストーリーボードまたは XIB ファイルに追加するには、ビューを追加して、そのカスタムクラスをGIDSignInButtonに設定します。ストーリーボードにGIDSignInButtonビューを追加すると、ログインボタンはインターフェース ビルダーでレンダリングされません。ログインボタンを確認するにはアプリを実行します。GIDSignInButtonの外観をカスタマイズするには、colorSchemeプロパティとstyleプロパティを設定します。GIDSignInButton のスタイル プロパティ colorSchemekGIDSignInButtonColorSchemeLight
kGIDSignInButtonColorSchemeDarkstylekGIDSignInButtonStyleStandard
kGIDSignInButtonStyleWide
kGIDSignInButtonStyleIconOnlyボタンを
signIn:を呼び出す ViewController のメソッドに接続します。たとえば、IBActionを使用します。Swift
@IBAction func signIn(sender: Any) { GIDSignIn.sharedInstance.signIn(withPresenting: self) { signInResult, error in guard error == nil else { return } // If sign in succeeded, display the app's main content View. } }Objective-C
- (IBAction)signIn:(id)sender { [GIDSignIn.sharedInstance signInWithPresentingViewController:self completion:^(GIDSignInResult * _Nullable signInResult, NSError * _Nullable error) { if (error) { return; } // If sign in succeeded, display the app's main content View. }]; }
4. ログアウト ボタンを追加する
アプリにログアウト ボタンを追加します。このボタンはログインしているユーザーに表示され、GIDSignIn の signOut メソッドを呼び出します。
signOut を呼び出すと、GIDSignIn に保存されているログイン状態がクリアされ、アプリのユーザー認証情報がキーチェーンから削除されます。アプリは、独自の状態と UI を更新する責任を負います。ログアウトはアプリにのみ適用されます。他のアプリやサービスからユーザーがログアウトされることはなく、ユーザーがアプリに付与した権限が取り消されることもありません。
SwiftUI の使用
SwiftUI で、GIDSignIn.sharedInstance.signOut() を呼び出す Button を追加します。
Button("Sign Out") {
GIDSignIn.sharedInstance.signOut()
// Calling signOut() may not automatically trigger UI updates.
// Update your app's state as needed.
}
UIKit の使用
ボタンを signOut: を呼び出す ViewController のメソッドに接続します。たとえば、IBAction を使用します。
Swift
@IBAction func signOut(sender: Any) {
GIDSignIn.sharedInstance.signOut()
}
Objective-C
- (IBAction)signOut:(id)sender {
[GIDSignIn.sharedInstance signOut];
}
次のステップ
ユーザーが Google アカウントを使用してアプリにログインできるようになったので、次の方法について学習します。
- ユーザーの Google アカウントのプロフィール情報を取得します。
- ユーザーの Google ID トークンを使用して、バックエンドで認証します。
- ユーザーに代わって Google API を呼び出す。