iOS アプリや macOS アプリに Google ログインを統合する

このページでは、iOS または macOS アプリに Google ログインを統合する方法について説明します。アプリのライフサイクルや UI モデルに合わせて、これらの手順を調整する必要がある場合があります。

始める前に

依存関係をダウンロードし、Xcode プロジェクトを構成して、クライアント ID を設定します

iOS と macOS のサンプルアプリを試して、ログインの仕組みを確認する

1. 認証リダイレクト URL を処理する

ユーザーが Google で認証されると、認証フローは、ユーザーの ID トークンを含む認証レスポンスを含む URL を使用してアプリにリダイレクトされます。この URL を GIDSignIn に渡すと、SDK はレスポンスを解析して、ユーザーの認証情報をアプリに返します。

iOS: UIApplicationDelegate

AppDelegate の application:openURL:options メソッドで、GIDSignInhandleURL: メソッドを呼び出します。

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

  1. アプリの AppDelegate で、applicationDidFinishLaunchingkAEGetURL イベントのハンドラを登録します。

    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];
    }
    
  2. GIDSignInhandleURL を呼び出すこれらのイベントのハンドラを定義します。

    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 を受信するハンドラを登録し、GIDSignInhandleURL を呼び出します。

Swift

@main
struct MyApp: App {

  var body: some Scene {
    WindowGroup {
      ContentView()
        // ...
        .onOpenURL { url in
          GIDSignIn.sharedInstance.handle(url)
        }
    }
  }
}

2. ユーザーのログイン状態の復元を試みます

アプリの起動時に restorePreviousSignInWithCallback を呼び出して、Google を使用してすでにログインしているユーザーのログイン状態の復元を試みます。これにより、ユーザーはアプリを開くたびにログインする必要がなくなります(ログアウトした場合を除く)。

iOS アプリでは UIApplicationDelegateapplication:didFinishLaunchingWithOptions: メソッドで、macOS アプリでは NSApplicationDelegateapplicationDidFinishLaunching: で、この処理を行うことがよくあります。この結果を使用して、ユーザーに表示するビューを決定します。次に例を示します。

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 を使用している場合は、初期ビューの onAppearrestorePreviousSignIn の呼び出しを追加します。

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 の使用

  1. プロジェクトに SwiftUI の [Google でログイン] ボタンの依存関係が追加されていることを確認します。

  2. SwiftUI ボタンを追加するファイルで、必要な import をファイルの先頭に追加します。

    import GoogleSignInSwift
    
  3. UIApplication 拡張機能を追加して、プレゼンテーション用のアクティブなルートビュー コントローラを取得します。

    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
      }
    }
    
  4. View に [Google でログイン] ボタンを追加し、ボタンが押されたときに呼び出されるアクションを指定します。

    GoogleSignInButton(action: handleSignInButton)
    
  5. ボタンが押されたときにログイン プロセスをトリガーするには、アクションで GIDSignInsignIn(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 の使用

  1. ログイン View に [Google でログイン] ボタンを追加します。GIDSignInButton クラスを使用すると、Google のブランド設定がされたボタンを自動的に生成する(推奨)か、カスタム スタイルで独自のボタンを作成できます。

    GIDSignInButton をストーリーボードまたは XIB ファイルに追加するには、ビューを追加して、そのカスタムクラスを GIDSignInButton に設定します。ストーリーボードに GIDSignInButton ビューを追加すると、ログインボタンはインターフェース ビルダーでレンダリングされません。ログインボタンを確認するにはアプリを実行します。

    GIDSignInButton の外観をカスタマイズするには、colorScheme プロパティと style プロパティを設定します。

    GIDSignInButton のスタイル プロパティ
    colorScheme kGIDSignInButtonColorSchemeLight
    kGIDSignInButtonColorSchemeDark
    style kGIDSignInButtonStyleStandard
    kGIDSignInButtonStyleWide
    kGIDSignInButtonStyleIconOnly
  2. ボタンを 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. ログアウト ボタンを追加する

アプリにログアウト ボタンを追加します。このボタンはログインしているユーザーに表示され、GIDSignInsignOut メソッドを呼び出します。

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 アカウントを使用してアプリにログインできるようになったので、次の方法について学習します。