Integrar el Acceso con Google en tu app para iOS o macOS

En esta página, se muestra cómo integrar el Acceso con Google en una app para iOS o macOS. Es posible que debas adaptar estas instrucciones al ciclo de vida o al modelo de IU de tu app.

Antes de comenzar

Descarga las dependencias, configura tu proyecto de Xcode y establece tu ID de cliente.

Prueba nuestra app de ejemplo para iOS y macOS y descubre cómo funciona el Acceso.

1. Controla la URL de redireccionamiento de autenticación

iOS: UIApplicationDelegate

En el método application:openURL:options de tu AppDelegate, llama al método handleURL: de 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. En el AppDelegate de tu app, registra un controlador para los eventos de kAEGetURL en 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. Define el controlador para estos eventos que llama a handleURL de 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

En la ventana o escena de tu app, registra un controlador para recibir la URL y llamar a GIDSignIns handleURL:

Swift

@main
struct MyApp: App {

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

2. Intenta restablecer el estado de acceso del usuario

Cuando se inicie tu app, llama a restorePreviousSignInWithCallback para intentar restablecer el estado de acceso de los usuarios que ya accedieron con Google. De esta manera, te aseguras de que los usuarios no tengan que acceder cada vez que abran tu app (a menos que hayan salido de su cuenta).

Las apps para iOS suelen hacerlo en el método application:didFinishLaunchingWithOptions: de UIApplicationDelegate y applicationDidFinishLaunching: de NSApplicationDelegate para las apps para macOS. Usa el resultado para determinar qué vista presentarle al usuario. Por ejemplo:

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

Si usas SwiftUI, agrega una llamada a restorePreviousSignIn en onAppear para tu vista 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. Agrega un botón de Acceso con Google

Agrega un botón de "Acceder con Google" a tu vista de acceso. Hay componentes disponibles para SwiftUI y UIKit que generan automáticamente un botón con la marca de Google y se recomienda usarlos.

Cómo usar SwiftUI

  1. Asegúrate de haber agregado la dependencia para el botón "Acceder con Google" de SwiftUI a tu proyecto.

  2. En el archivo en el que deseas agregar el botón de SwiftUI, agrega la importación obligatoria en la parte superior del archivo:

    import GoogleSignInSwift
    
  3. Agrega un botón "Acceder con Google" a tu vista y especifica la acción que se llamará cuando se presione el botón:

    GoogleSignInButton(action: handleSignInButton)
    
  4. Agrega una llamada al método signIn(presentingViewController:completion:) de GIDSignIn en tu acción para activar el proceso de acceso cuando se presione el botón:

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

Esto usa el modelo de vista predeterminado que proporciona información de diseño estándar para el botón. Para controlar la apariencia del botón, debes crear un GoogleSignInButtonViewModel personalizado y establecerlo como el viewModel en el inicializador del botón con GoogleSignInButton(viewModel: yourViewModel, action: yourAction). Consulta el código fuente de GoogleSignInButtonViewModel para obtener más información.

Cómo usar UIKit

  1. Agrega un botón de "Acceder con Google" a tu vista de acceso. Puedes usar la clase GIDSignInButton para generar automáticamente un botón con la marca de Google (recomendado) o crear tu propio botón con un diseño personalizado.

    Para agregar un GIDSignInButton a un storyboard o archivo XIB, agrega una vista y configura su clase personalizada como GIDSignInButton. Ten en cuenta que, cuando agregas una vista GIDSignInButton a tu storyboard, el botón de acceso no se renderiza en el compilador de interfaz. Ejecuta la app para ver el botón de acceso.

    Puedes personalizar la apariencia de un GIDSignInButton configurando sus propiedades colorScheme y style:

    Propiedades de estilo de GIDSignInButton
    colorScheme kGIDSignInButtonColorSchemeLight
    kGIDSignInButtonColorSchemeDark
    style kGIDSignInButtonStyleStandard
    kGIDSignInButtonStyleWide
    kGIDSignInButtonStyleIconOnly
  2. Conecta el botón a un método en tu ViewController que llame a signIn:. Por ejemplo, usa un 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. Agrega un botón para salir

  1. Agrega un botón para salir de la app que sea visible para los usuarios que accedieron a sus cuentas.

  2. Conecta el botón a un método en tu ViewController que llame a signOut:. Por ejemplo, usa un IBAction:

    Swift

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

    Objective-C

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

Próximos pasos

Ahora que los usuarios pueden acceder a tu app con sus Cuentas de Google, descubre cómo hacer lo siguiente: