Integracja Logowania przez 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 modelu interfejsu.

Zanim zaczniesz

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

Wypróbuj naszą przykładową aplikację na iOS i macOS, aby zobaczyć, jak działa logowanie.

1. Obsługa adresu URL przekierowania uwierzytelniania

Gdy użytkownik uwierzytelni się w Google, przepływ uwierzytelniania przekieruje go z powrotem do aplikacji z adresem URL zawierającym odpowiedź uwierzytelniania, w tym token identyfikatora użytkownika. Przekazanie tego adresu URL do GIDSignIn umożliwia pakietowi SDK przeanalizowanie odpowiedzi i zwrócenie danych logowania użytkownika do aplikacji.

iOS: UIApplicationDelegate

W metodzie application:openURL:options delegata aplikacji wywołaj metodę handleURL: klasy 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 delegacie aplikacji 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. Zdefiniuj moduł obsługi tych zdarzeń, który wywołuje metodę handleURL klasy 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 scenie aplikacji zarejestruj moduł obsługi, który będzie odbierać adres URL i wywoływać metodę handleURL klasy GIDSignIn:

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ę uruchamia, wywołaj metodę restorePreviousSignInWithCallback, aby spróbować przywrócić stan logowania użytkowników, którzy już zalogowali się za pomocą Google. Dzięki temu użytkownicy nie muszą logować się za każdym razem, gdy otwierają aplikację (chyba że się wylogowali).

Aplikacje na iOS często robią to w metodzie application:didFinishLaunchingWithOptions: klasy UIApplicationDelegate, a aplikacje na macOS w metodzie applicationDidFinishLaunching: klasy NSApplicationDelegate. Na podstawie wyniku określ, który widok ma się wyświetlić użytkownikowi. Na 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 wywołanie metody restorePreviousSignIn w metodzie onAppear 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. Dodawanie przycisku logowania przez Google

Dodaj przycisk „Zaloguj się przez Google” do widoku logowania. Dostępne są komponenty dla SwiftUI i UIKit, które automatycznie generują przycisk zgodny z wytycznymi dotyczącymi marki Google.

Korzystanie z SwiftUI

  1. Upewnij się, że do projektu dodano zależność 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 rozszerzenie UIApplication, aby pobrać aktywny główny kontroler widoku na potrzeby prezentacji:

    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. Dodaj przycisk „Zaloguj się przez Google” do widoku i określ działanie, które zostanie wywołane po naciśnięciu przycisku:

    GoogleSignInButton(action: handleSignInButton)
    
  5. Po naciśnięciu przycisku uruchom proces logowania, dodając wywołanie metody signIn(withPresenting:completion:) klasy GIDSignIn w działaniu:

    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.
      }
    }
    

Używa to 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 za pomocą GoogleSignInButton(viewModel: yourViewModel, action: yourAction). Więcej informacji znajdziesz w GoogleSignInButtonViewModel kodzie źródłowym.

Korzystanie z UIKit

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

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

    Wygląd GIDSignInButton możesz dostosować, 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 ViewController, która wywołuje metodę 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. Dodawanie przycisku wylogowania

Dodaj do aplikacji przycisk wylogowania widoczny dla zalogowanych użytkowników, który wywołuje metodę signOut klasy GIDSignIn.

Wywołanie metody signOut czyści stan logowania przechowywany w GIDSignIn i usuwa dane logowania użytkownika do aplikacji z pęku kluczy. Aplikacja jest odpowiedzialna za aktualizowanie własnego stanu i interfejsu. Wylogowanie dotyczy tylko Twojej aplikacji. Nie powoduje wylogowania użytkownika z innych aplikacji ani usług i nie cofa uprawnień przyznanych aplikacji przez użytkownika.

Korzystanie z SwiftUI

W SwiftUI dodaj Button, który wywołuje metodę GIDSignIn.sharedInstance.signOut():

Button("Sign Out") {
  GIDSignIn.sharedInstance.signOut()
  // Calling signOut() may not automatically trigger UI updates.
  // Update your app's state as needed.
}

Korzystanie z UIKit

Połącz przycisk z metodą w ViewController, która wywołuje metodę 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ą kont Google, dowiedz się, jak: