การผสานรวม Google Sign-In กับแอป iOS หรือ macOS

หน้านี้แสดงวิธีผสานรวม Google Sign-In ในแอป iOS หรือ macOS คุณอาจต้องปรับวิธีการเหล่านี้สําหรับอายุการใช้งานหรือโมเดล UI ของแอป

ก่อนเริ่มต้น

ดาวน์โหลดทรัพยากร Dependency กําหนดค่าโปรเจ็กต์ Xcode แล้วตั้งค่ารหัสไคลเอ็นต์

1. จัดการ URL เปลี่ยนเส้นทางการตรวจสอบสิทธิ์

iOS: UIApplicationDelegate

ในเมธอด application:openURL:options ของ AppDelegate ให้เรียกใช้เมธอด handleURL: ของ GIDSignIn ดังนี้

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. กําหนดเครื่องจัดการสําหรับเหตุการณ์เหล่านี้ซึ่งเรียกใช้ handleURL ของ GIDSignIn

    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 และเรียก handleURL GIDSignIn

Swift

@main
struct MyApp: App {

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

2. การพยายามกู้คืนสถานะการลงชื่อเข้าใช้ของผู้ใช้

เมื่อแอปเริ่มทํางาน ให้โทรหา restorePreviousSignInWithCallback เพื่อพยายามกู้คืนสถานะการลงชื่อเข้าใช้ของผู้ใช้ที่ลงชื่อเข้าใช้ด้วย Google อยู่แล้ว ซึ่งช่วยให้ผู้ใช้ไม่ต้องลงชื่อเข้าใช้ทุกครั้งที่เปิดแอป (เว้นแต่จะออกจากระบบ)

แอป iOS มักจะดําเนินการนี้ในเมธอด application:didFinishLaunchingWithOptions: ของ UIApplicationDelegate และ applicationDidFinishLaunching: ของ NSApplicationDelegate สําหรับแอป 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 ให้เพิ่มการเรียกใช้ไปยัง restorePreviousSignIn ใน onAppear เพื่อดูมุมมองเริ่มต้น

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 Sign-In

เพิ่มปุ่ม "ลงชื่อเข้าใช้ด้วย Google" ลงในมุมมองการลงชื่อเข้าใช้ คอมโพเนนต์พร้อมใช้งานสําหรับ SwiftUI และ UIKit ที่สร้างปุ่มโดยอัตโนมัติด้วยการแสดงแบรนด์ Google และแนะนําให้ใช้

การใช้ SwiftUI

  1. ตรวจสอบว่าคุณได้เพิ่มทรัพยากร Dependency สําหรับปุ่ม "ลงชื่อเข้าใช้ด้วย Google" ใน SwiftUI ในโปรเจ็กต์

  2. ในไฟล์ที่ต้องการเพิ่มปุ่ม SwiftUI ให้เพิ่มการนําเข้าที่จําเป็นไว้ที่ด้านบนของไฟล์ดังนี้

    import GoogleSignInSwift
    
  3. เพิ่มปุ่ม "ลงชื่อเข้าใช้ด้วย Google" ในข้อมูลพร็อพเพอร์ตี้ของคุณ และระบุการทํางานที่จะถูกเรียกใช้เมื่อกดปุ่ม:

    GoogleSignInButton(action: handleSignInButton)
    
  4. เริ่มกระบวนการลงชื่อเข้าใช้เมื่อมีการกดปุ่มโดยการเพิ่มวิธีเมธอด signIn(presentingViewController:completion:) ของ GIDSignIn ในการดําเนินการนี้

    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 (แนะนํา) หรือสร้างปุ่มของคุณเองด้วยการจัดรูปแบบที่กําหนดเอง

    หากต้องการเพิ่ม GIDSignInButton ลงในสตอรีบอร์ดหรือไฟล์ XIB ให้เพิ่มมุมมองและตั้งค่าคลาสที่กําหนดเองเป็น GIDSignInButton โปรดทราบว่าเมื่อคุณเพิ่มมุมมอง GIDSignInButton ลงในสตอรีบอร์ด ปุ่มลงชื่อเข้าใช้จะไม่แสดงผลในเครื่องมือสร้างอินเทอร์เฟซ เรียกใช้แอปเพื่อดูปุ่มลงชื่อเข้าใช้

    คุณปรับแต่งลักษณะที่ปรากฏของ GIDSignInButton ได้โดยตั้งค่าพร็อพเพอร์ตี้ colorScheme และ style ดังนี้

    พร็อพเพอร์ตี้รูปแบบ 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 ได้แล้ว ดูวิธีการต่อไปนี้