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

iOS: UIApplicationDelegate

W metodzie application:openURL:options w pliku AppDelegate wywołaj metodę 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. W pliku AppDelegate aplikacji zarejestruj moduł obsługi zdarzeń kAEGetURL w sekcji 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 GIDSignIn handleURL:

    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ć GIDSignIns handleURL:

Swift

@main
struct MyApp: App {

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

2. Spróbuj przywrócić stan logowania użytkownika.

Gdy aplikacja się uruchamia, wywołaj funkcję restorePreviousSignInWithCallback, aby spróbować przywrócić stan logowania użytkowników, którzy zalogowali się już za pomocą 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 UIApplicationDelegateapplication:didFinishLaunchingWithOptions:, a aplikacje na macOS – w metodzie NSApplicationDelegateapplicationDidFinishLaunching:. Na podstawie wyniku określ, który widok ma być wyświetlany 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 funkcji restorePreviousSignInonAppear 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. 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 z logo Google. Zalecamy ich używanie.

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 na jego początku wymagany import:

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

    GoogleSignInButton(action: handleSignInButton)
    
  4. Aby uruchomić proces logowania po naciśnięciu przycisku, dodaj wywołanie metody GIDSignIns signIn(presentingViewController:completion:) w działaniu:

    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żywa 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 GoogleSignInButtonViewModelkodzie ź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 logo Google (zalecane), lub utworzyć własny przycisk ze stylem niestandardowym.

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

    Wygląd elementu GIDSignInButton możesz dostosować, ustawiając jego właściwości colorSchemestyle:

    Właściwości stylu GIDSignInButton
    colorScheme kGIDSignInButtonColorSchemeLight
    kGIDSignInButtonColorSchemeDark
    style kGIDSignInButtonStyleStandard
    kGIDSignInButtonStyleWide
    kGIDSignInButtonStyleIconOnly
  2. Połącz przycisk z metodą w kontrolerze widoku, która wywołuje signIn:. Użyj na przykład elementu 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 aplikacji przycisk wylogowania widoczny dla zalogowanych użytkowników.

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

    Swift

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

    Objective-C

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

Dalsze kroki

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