Integracja logowania Google z aplikacją na iOS lub macOS

Z tej strony dowiesz się, jak zintegrować Logowanie przez Google z aplikacją na iOS lub macOS. Może być konieczne dostosowanie tych instrukcji do cyklu życia aplikacji lub jej modelu interfejsu użytkownika.

Zanim zaczniesz

Pobierz zależności, skonfiguruj projekt Xcode i ustaw identyfikator klienta.

1. Obsługa adresu URL przekierowania uwierzytelniania

iOS: UIApplicationDelegate

W metodzie application:openURL:options AppDelegate wywołaj metodę 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. W funkcji AppDelegate zarejestruj moduł obsługi zdarzeń kAEGetURL w: 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. Określ moduł obsługi tych zdarzeń wywołujących metodę handleURL w systemie 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.

W oknie lub punkcie widokowym aplikacji zarejestruj moduł obsługi, który będzie otrzymywać URL i wywołał GIDSignIns handleURL:

Swift

@main
struct MyApp: App {

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

2. Próba przywrócenia stanu logowania użytkownika

Gdy aplikacja się uruchomi, wywołaj funkcję restorePreviousSignInWithCallback, aby spróbować przywrócić stan logowania użytkowników, którzy zalogowali się już przez Google. Dzięki temu użytkownicy nie będą musieli logować się za każdym razem, gdy otworzą aplikację (chyba że się wylogują).

Aplikacje na iOS często robią to w metodzie application:didFinishLaunchingWithOptions: systemu UIApplicationDelegate, a applicationDidFinishLaunching: w przypadku aplikacji na macOS – NSApplicationDelegate. Na podstawie tego wyniku możesz określić, który widok chcesz pokazać użytkownikowi. Przykład:

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.

Jeśli używasz SwiftUI, dodaj połączenie do restorePreviousSignIn w onAppear dla początkowego widoku:

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. Dodaj przycisk Logowania przez Google

Dodaj przycisk „Zaloguj się przez Google” do widoku logowania. Komponenty są dostępne dla SwiftUI i UIKit, które automatycznie generują przycisk z marką Google i są zalecane.

Korzystanie z SwiftUI

  1. Sprawdź, czy w projekcie dodano zależność od przycisku „Zaloguj się przez Google” w SwiftUI.

  2. W pliku, w którym chcesz dodać przycisk SwiftUI, dodaj wymagany import na początku pliku:

    import GoogleSignInSwift
    
  3. Dodaj do widoku przycisk „Zaloguj się przez Google” i określ działanie, które będzie wywoływane po jego naciśnięciu:

    GoogleSignInButton(action: handleSignInButton)
    
  4. Aktywuj proces logowania po naciśnięciu przycisku, dodając do metody wywołanie GIDSignIn metodysignIn(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.
        }
      )
    }
    

Korzysta z domyślnego modelu widoku, który zawiera standardowe informacje o stylu przycisku. Aby kontrolować wygląd przycisku, musisz utworzyć niestandardowy GoogleSignInButtonViewModel i ustawić go jako viewModel w inicjatorze przycisku, używając GoogleSignInButton(viewModel: yourViewModel, action: yourAction). Więcej informacji znajdziesz w kodzie źródłowym GoogleSignInButtonViewModel.

Korzystanie z UIKit

  1. Dodaj przycisk „Zaloguj się przez Google” do widoku logowania. Możesz użyć klasy GIDSignInButton, aby automatycznie wygenerować przycisk z logo Google (zalecane) lub utworzyć własny przycisk ze stylem niestandardowym.

    Aby dodać GIDSignInButton do scenorysu lub pliku XIB, dodaj widok i ustaw jego klasę niestandardową na GIDSignInButton. Pamiętaj, że gdy dodasz widok GIDSignInButton do scenorysu, przycisk logowania nie wyświetli się w kreatorze interfejsu. Uruchom aplikację, aby zobaczyć przycisk logowania.

    Możesz dostosować wygląd elementu GIDSignInButton, ustawiając jego właściwości colorScheme i style:

    Właściwości stylu GIDSignInButton
    colorScheme kGIDSignInButtonColorSchemeLight
    kGIDSignInButtonColorSchemeDark
    style kGIDSignInButtonStyleStandard
    kGIDSignInButtonStyleWide
    kGIDSignInButtonStyleIconOnly
  2. Połącz przycisk z metodą w kontrolerze ViewView, która wywołuje obiekt signIn:. Na przykład użyj 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. Dodaj przycisk wylogowania

  1. Dodaj do aplikacji przycisk wylogowania widoczny dla zalogowanych użytkowników.

  2. Połącz przycisk z metodą w kontrolerze ViewView, która wywołuje obiekt signOut:. Na przykład użyj IBAction:

    Swift

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

    Objective-C

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

Dalsze kroki

Teraz gdy użytkownicy mogą logować się w Twojej aplikacji za pomocą swoich kont Google, dowiedz się, jak: