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

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

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

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

ลองใช้แอปตัวอย่างสำหรับ iOS และ macOS เพื่อดูวิธีการทำงานของการลงชื่อเข้าใช้

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

iOS: UIApplicationDelegate

ในเมธอด application:openURL:options ของ AppDelegate ให้เรียกใช้ 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

  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 มักจะทำเช่นนี้ใน UIApplicationDelegate application:didFinishLaunchingWithOptions: วิธีและ 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. ตรวจสอบว่าคุณเพิ่มการขึ้นต่อกันสำหรับ 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 การสร้างแบรนด์ (แนะนำ) หรือสร้างปุ่มของคุณเองด้วยการจัดรูปแบบที่กำหนดเอง

    หากต้องการเพิ่ม 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 ของตนเองได้แล้ว โปรดดูวิธีการ เป็น: