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 para el ciclo de vida o el 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 para ver cómo funciona el Acceso.
1. Controla la URL de redireccionamiento de autenticación
Después de que un usuario se autentica con Google, el flujo de autenticación redirecciona a tu app con una URL que contiene la respuesta de autenticación, incluido el token de ID del usuario. Si pasas esta URL a GIDSignIn, el SDK podrá analizar la respuesta y devolver las credenciales del usuario a tu app.
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
En el AppDelegate de tu app, registra un controlador para eventos
kAEGetURLenapplicationDidFinishLaunching: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]; }Define el controlador para estos eventos que llama a
handleURLdeGIDSignIn: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 handleURL de GIDSignIn:
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 inicia tu app, llama a restorePreviousSignInWithCallback para intentar restablecer el estado de acceso de los usuarios que ya accedieron con Google. De esta manera, se garantiza que los usuarios no tengan que acceder cada vez que abran tu app (a menos que hayan cerrado la sesión).
Las apps para iOS suelen hacer esto en el método application:didFinishLaunchingWithOptions: de UIApplicationDelegate y applicationDidFinishLaunching: de NSApplicationDelegate para apps para macOS. Usa el resultado para determinar qué vista mostrar 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 "Acceder con Google" a tu vista de acceso. Hay componentes disponibles para SwiftUI y UIKit que generan automáticamente un botón que cumple con los lineamientos de marca de Google.
Cómo usar SwiftUI
Asegúrate de haber agregado la dependencia del botón "Acceder con Google" de SwiftUI a tu proyecto.
En el archivo en el que deseas agregar el botón de SwiftUI, agrega la importación requerida en la parte superior del archivo:
import GoogleSignInSwiftAgrega una extensión
UIApplicationpara recuperar el controlador de vista raíz activo para la presentación: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 } }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)Activa el proceso de acceso cuando se presione el botón agregando una llamada al método
signIn(withPresenting:completion:)deGIDSignInen tu acción: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. } }
Esto usa el modelo de vista predeterminado que proporciona información de estilo estándar para el botón. Para controlar la apariencia del botón, debes crear un
GoogleSignInButtonViewModel personalizado y establecerlo como viewModel en el
inicializador del botón con GoogleSignInButton(viewModel: yourViewModel, action:
yourAction). Consulta el código fuente para obtener más información.GoogleSignInButtonViewModel
Cómo usar UIKit
Agrega un botón "Acceder con Google" a tu vista de acceso. Puedes usar la clase
GIDSignInButtonpara generar automáticamente un botón con la marca de Google (recomendado) o crear tu propio botón con un estilo personalizado.Para agregar un
GIDSignInButtona un storyboard o archivo XIB, agrega una vista y define su clase personalizada comoGIDSignInButton. Ten en cuenta que cuando agregas una vistaGIDSignInButtona tu storyboard, el botón de acceso no se dibuja en el compilador de interfaz. Para ver el botón de acceso, debes ejecutar la app.Puedes personalizar la apariencia de un
GIDSignInButtonconfigurando sus propiedadescolorSchemeystyle:Propiedades de estilo de GIDSignInButton colorSchemekGIDSignInButtonColorSchemeLight
kGIDSignInButtonColorSchemeDarkstylekGIDSignInButtonStyleStandard
kGIDSignInButtonStyleWide
kGIDSignInButtonStyleIconOnlyConecta el botón a un método en tu ViewController que llame a
signIn:. Por ejemplo, usa unIBAction: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 cerrar la sesión
Agrega un botón para cerrar la sesión a tu app, visible para los usuarios que accedieron, que llame al método signOut de GIDSignIn.
Si llamas a signOut, se borra el estado de acceso almacenado en GIDSignIn y se quitan las credenciales del usuario para tu app del llavero. Tu app es responsable de actualizar su propio estado y su IU. Cerrar la sesión solo se aplica a tu app. No cierra la sesión del usuario en otras apps o servicios, y no revoca los permisos que el usuario otorgó a tu app.
Cómo usar SwiftUI
En SwiftUI, agrega un Button que llame a GIDSignIn.sharedInstance.signOut():
Button("Sign Out") {
GIDSignIn.sharedInstance.signOut()
// Calling signOut() may not automatically trigger UI updates.
// Update your app's state as needed.
}
Cómo usar UIKit
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, obtén información para hacer lo siguiente:
- Obtener la información del perfil de la Cuenta de Google de los usuarios.
- Autenticarte con tu backend usando el ID de Google del usuario token.
- Llamar a las APIs de Google en nombre del usuario.