Integrar o Login do Google no seu app para iOS ou macOS

Esta página mostra como integrar o Login do Google a um app iOS ou macOS. Talvez seja necessário adaptar essas instruções ao ciclo de vida ou ao modelo de interface do seu app.

Antes de começar

Faça o download das dependências, configure seu projeto do Xcode e defina o ID do cliente.

Teste nosso app de exemplo para iOS e macOS para ver como o Login funciona.

1. Processar o URL de redirecionamento de autenticação

Depois que um usuário faz a autenticação com o Google, o fluxo de autenticação é redirecionado de volta para o app com um URL que contém a resposta de autenticação, incluindo o token de ID do usuário. A transmissão desse URL para GIDSignIn permite que o SDK analise a resposta e retorne as credenciais do usuário ao app.

iOS: UIApplicationDelegate

No método application:openURL:options do AppDelegate, chame o método handleURL: do 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. No AppDelegate do app, registre um gerenciador para eventos kAEGetURL em 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. Defina o gerenciador para esses eventos que chama handleURL do 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

Na janela ou cena do app, registre um gerenciador para receber o URL e chame handleURL do GIDSignIn:

Swift

@main
struct MyApp: App {

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

2. Tentar restaurar o estado de login do usuário

Quando o app é iniciado, chame restorePreviousSignInWithCallback para tentar restaurar o estado de login dos usuários que já fizeram login usando o Google. Isso garante que os usuários não precisem fazer login sempre que abrirem o app, a menos que tenham feito logout.

Os apps iOS geralmente fazem isso no método application:didFinishLaunchingWithOptions: do UIApplicationDelegate e applicationDidFinishLaunching: do NSApplicationDelegate para apps macOS. Use o resultado para determinar qual visualização apresentar ao usuário. Exemplo:

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

Se você estiver usando o SwiftUI, adicione uma chamada para restorePreviousSignIn em onAppear para a visualização inicial:

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. Adicionar um botão de Login do Google

Adicione um botão "Fazer login com o Google" à visualização de login. Os componentes estão disponíveis para SwiftUI e UIKit, que geram automaticamente um botão aderente às diretrizes de marca do Google.

Como usar o SwiftUI

  1. Verifique se você adicionou a dependência do botão "Fazer login com o Google" do SwiftUI ao seu projeto.

  2. No arquivo em que você quer adicionar o botão do SwiftUI, adicione a importação necessária na parte de cima do arquivo:

    import GoogleSignInSwift
    
  3. Adicione uma extensão UIApplication para recuperar o controlador de visualização raiz ativo para apresentação:

    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. Adicione um botão "Fazer login com o Google" à visualização e especifique a ação que será chamada quando o botão for pressionado:

    GoogleSignInButton(action: handleSignInButton)
    
  5. Acione o processo de login quando o botão for pressionado, adicionando uma chamada ao método signIn(withPresenting:completion:) do GIDSignIn na sua ação:

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

Isso usa o modelo de visualização padrão que fornece informações de estilo padrão para o botão. Para controlar a aparência do botão, é necessário criar um GoogleSignInButtonViewModel personalizado e defini-lo como viewModel no inicializador do botão usando GoogleSignInButton(viewModel: yourViewModel, action: yourAction). Consulte o GoogleSignInButtonViewModel código-fonte para mais informações.

Como usar o UIKit

  1. Adicione um botão "Fazer login com o Google" à visualização de login. Você pode usar a classe GIDSignInButton para gerar automaticamente um botão com a marca do Google (recomendado) ou criar seu próprio botão com estilo personalizado.

    Para adicionar um GIDSignInButton a um storyboard ou arquivo XIB, inclua uma visualização e defina a classe personalizada como GIDSignInButton. Quando você adiciona uma visualização GIDSignInButton ao storyboard, o botão de login não é renderizado no construtor de interface. Execute o aplicativo para ver o botão de login.

    É possível personalizar a aparência de um GIDSignInButton definindo as propriedades colorScheme e style:

    Propriedades de estilo GIDSignInButton
    colorScheme kGIDSignInButtonColorSchemeLight
    kGIDSignInButtonColorSchemeDark
    style kGIDSignInButtonStyleStandard
    kGIDSignInButtonStyleWide
    kGIDSignInButtonStyleIconOnly
  2. Conecte o botão a um método no ViewController que chama signIn:. Por exemplo, use um 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. Adicionar um botão de logout

Adicione um botão de logout ao app, visível para usuários conectados, que chama o método signOut do GIDSignIn.

A chamada de signOut limpa o estado de login armazenado em GIDSignIn e remove as credenciais do usuário para seu app do Keychain. Seu app é responsável por atualizar o próprio estado e a interface. O logout só se aplica ao seu app. Ele não faz logout do usuário de outros apps ou serviços e não revoga as permissões que o usuário concedeu ao seu app.

Como usar o SwiftUI

No SwiftUI, adicione um Button que chama GIDSignIn.sharedInstance.signOut():

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

Como usar o UIKit

Conecte o botão a um método no ViewController que chama signOut:. Por exemplo, use um IBAction:

Swift

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

Objective-C

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

Próximas etapas

Agora que os usuários podem fazer login no seu app usando as Contas do Google, aprenda a: