在 iOS 或 macOS 應用程式中整合 Google 登入

本頁面說明如何將 Google 登入整合至 iOS 或 macOS 應用程式。 您可能需要根據應用程式的生命週期或 UI 模型調整這些操作說明。

事前準備

下載依附元件、設定 Xcode 專案,並設定用戶端 ID

歡迎試用 iOS 和 macOS 範例應用程式,瞭解登入功能的運作方式

1. 處理驗證重新導向網址

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 會在以下位置註冊 kAEGetURL 事件的處理常式: applicationDidFinishLaunching:

    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

在應用程式視窗或情境中,註冊處理常式來接收網址並呼叫 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: 方法和 NSApplicationDelegateapplicationDidFinishLaunching: (適用於 macOS 應用程式)。使用 並決定要呈現的檢視畫面。例如:

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 帳戶登入」按鈕。 元件適用於 SwiftUI 和 UIKit,可自動產生 按鈕,且建議使用

使用 SwiftUI

  1. 請確認您已新增SwiftUI「使用 Google 帳戶登入」功能的依附元件按鈕

  2. 在要新增 SwiftUI 按鈕的檔案中,將必要的匯入內容新增至檔案頂端:

    import GoogleSignInSwift
    
  3. 新增「使用 Google 帳戶登入」新增「檢視」按鈕,並指定動作 會在按下按鈕時呼叫的:

    GoogleSignInButton(action: handleSignInButton)
    
  4. 透過新增呼叫來觸發登入程序 GIDSignIn的 其中 signIn(presentingViewController:completion:) 種方法 您的動作:

    func handleSignInButton() {
      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,並將其設為按鈕的 viewModel 初始化器使用 GoogleSignInButton(viewModel: yourViewModel, action: yourAction)。詳情請見 GoogleSignInButtonViewModel 原始碼 瞭解詳情

使用 UIKit

  1. 新增「使用 Google 帳戶登入」按鈕。您可以使用 GIDSignInButton 類別,透過 Google 自動產生按鈕 品牌宣傳 (建議) 或使用自訂樣式自行建立按鈕。

    如要在分鏡腳本或 XIB 檔案中加入 GIDSignInButton,請新增檢視畫面並設定 傳遞至 GIDSignInButton 的自訂類別。請注意,新增 GIDSignInButton 前往分鏡腳本查看登入按鈕 導入及設定執行應用程式,即可查看登入按鈕。

    您可以設定 GIDSignInButton 的外觀,以自訂其外觀 colorSchemestyle 屬性:

    GIDSignInButton 樣式屬性
    colorScheme kGIDSignInButtonColorSchemeLight
    kGIDSignInButtonColorSchemeDark
    style kGIDSignInButtonStyleStandard
    kGIDSignInButtonStyleWide
    kGIDSignInButtonStyleIconOnly
  2. 將按鈕連結至 ViewController 中會呼叫的方法 signIn:。例如,使用 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. 新增登出按鈕

  1. 在應用程式中新增登出按鈕,只有已登入的使用者會看到。

  2. 將按鈕連結至 ViewController 中會呼叫的方法 signOut:。例如,使用 IBAction

    Swift

    @IBAction func signOut(sender: Any) {
      GIDSignIn.sharedInstance.signOut()
    }
    

    Objective-C

    - (IBAction)signOut:(id)sender {
      [GIDSignIn.sharedInstance signOut];
    }
    

後續步驟

現在使用者可以透過自己的 Google 帳戶登入您的應用程式,歡迎瞭解如何使用 改為: