Integracja Logowania przez Google z aplikacją na iOS lub macOS

Na tej stronie 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 UI.

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

iOS: UIApplicationDelegate

W metodzie application:openURL:options AppDelegate wywołaj metodę handleURL: metody 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 sekcji AppDelegate w Twojej 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. Określ moduł obsługi tych zdarzeń, które będą wywoływać typ handleURL obiektu 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

Zarejestruj moduł obsługi w oknie lub scenie aplikacji, aby otrzymać adres URL i wywołać interfejs GIDSignIn 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 zalogowania użytkownika

Po uruchomieniu aplikacji wywołaj 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 otwierają Twoją aplikację (chyba że się wylogują).

W aplikacjach na iOS często robią to za pomocą metody application:didFinishLaunchingWithOptions: UIApplicationDelegate i applicationDidFinishLaunching: NSApplicationDelegate w przypadku aplikacji na macOS. Na jego podstawie określ, który widok 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 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. W SwiftUI i UIKit dostępne są komponenty, które automatycznie generują przycisk z logo Google i są zalecane do użycia.

Używanie SwiftUI

  1. Pamiętaj, aby dodać do projektu zależność do przycisku SwiftUI „Zaloguj się przez Google”.

  2. Na początku pliku, do którego chcesz dodać przycisk SwiftUI, dodaj wymagany import:

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

    GoogleSignInButton(action: handleSignInButton)
    
  4. Aktywuj proces logowania po naciśnięciu przycisku, dodając w działaniu wywołanie do metody signIn(presentingViewController:completion:) użytkownika 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.
        }
      )
    }
    

Używany jest domyślny model widoku, który udostępnia 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 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 elementami marki Google (zalecane), lub utworzyć własny przycisk z niestandardowym stylem.

    Aby dodać obiekt GIDSignInButton do pliku scenorysu lub XIB, dodaj widok danych i ustaw jego klasę niestandardową na GIDSignInButton. Pamiętaj, że po dodaniu widoku GIDSignInButton do scenorysu przycisk logowania nie jest renderowany w kreatorze interfejsów. Uruchom aplikację, aby zobaczyć przycisk logowania.

    Wygląd elementu 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 kontrolerze ViewController, która wywołuje signIn:. Użyj na przykład atrybutu 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

  1. Dodaj do swojej aplikacji przycisk wylogowania, który będzie widoczny dla zalogowanych użytkowników.

  2. Połącz przycisk z metodą w kontrolerze ViewController, która wywołuje signOut:. Użyj na przykład atrybutu IBAction:

    Swift

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

    Objective-C

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

Dalsze kroki

Użytkownicy mogą już logować się w aplikacji za pomocą kont Google. Dowiedz się, jak: