Accede a las APIs de Google en una app para iOS

Algunos servicios de Google, como Drive, Gmail y muchos otros, proporcionan APIs públicas que puedes usar para crear apps que ayuden a los usuarios a trabajar con sus datos en estos servicios. Para acceder a estos servicios, las apps deben implementar uno de los flujos del cliente de OAuth 2.0 a fin de obtener el consentimiento de los usuarios y obtener tokens de acceso, que otorgan acceso a las API.

Puedes usar la biblioteca de Acceso con Google, que implementa el flujo de OAuth 2.0 por ti, a fin de obtener tokens de acceso para el usuario que accedió.

Antes de comenzar

Debes completar la integración básica con el Acceso con Google.

1. Verifica qué permisos se otorgaron

Antes de realizar una llamada a una API de Google, verifica qué permisos ya se otorgaron a tu app mediante la propiedad grantedScopes de GIDGoogleUser:

Swift

let driveScope = "https://www.googleapis.com/auth/drive.readonly"
let grantedScopes = user.grantedScopes
if grantedScopes == nil || !grantedScopes!.contains(driveScope) {
  // Request additional Drive scope.
}

Objective‑C

NSString *driveScope = @"https://www.googleapis.com/auth/drive.readonly";

// Check if the user has granted the Drive scope
if (![user.grantedScopes containsObject:driveScope]) {
  // request additional drive scope
}

En función de si el usuario otorgó o no un alcance determinado, es posible que debas realizar una solicitud de un alcance adicional para admitir una interacción en particular.

2. Solicita permisos adicionales

Si necesitas solicitar permisos adicionales, llama a addScopes:presentingViewController:completion o addScopes:presentingWindow:completion para pedirle al usuario que otorgue acceso adicional a tu app.

Por ejemplo, para solicitar acceso de solo lectura a los archivos de Drive de un usuario, haz lo siguiente:

Swift

let additionalScopes = ["https://www.googleapis.com/auth/drive.readonly"]
guard let currentUser = GIDSignIn.sharedInstance.currentUser else {
    return ;  /* Not signed in. */
}

currentUser.addScopes(additionalScopes, presenting: self) { signInResult, error in
    guard error == nil else { return }
    guard let signInResult = signInResult else { return }

    // Check if the user granted access to the scopes you requested.
}

Objective‑C

NSArray *additionalScopes = @[ @"https://www.googleapis.com/auth/drive.readonly" ];
GIDGoogleUser *currentUser = GIDSignIn.sharedInstance.currentUser;

[currentUser addScopes:additionalScopes
           presentingViewController:self
                         completion:^(GIDSignInResult * _Nullable signInResult,
                                      NSError * _Nullable error) {
    if (error) { return; }
    if (signInResult == nil) { return; }

    // Check if the user granted access to the scopes you requested.
}];

3. Realiza una llamada a la API con tokens nuevos

Para asegurarte de que las llamadas a la API de Google siempre tengan tokens de acceso no vencidos, une las llamadas en un bloque refreshTokensIfNeededWithCompletion::

Swift

currentUser.refreshTokensIfNeeded { user, error in
    guard error == nil else { return }
    guard let user = user else { return }

    // Get the access token to attach it to a REST or gRPC request.
    let accessToken = user.accessToken.tokenString

    // Or, get an object that conforms to GTMFetcherAuthorizationProtocol for
    // use with GTMAppAuth and the Google APIs client library.
    let authorizer = user.fetcherAuthorizer()
}

Objective‑C

[currentUser refreshTokensIfNeededWithCompletion:^(
                              GIDGoogleUser * _Nullable user,
                              NSError * _Nullable error) {
    if (error) { return; }
    if (user == nil) { return; }

    // Get the access token to attach it to a REST or gRPC request.
    NSString *accessToken = user.accessToken.tokenString;

    // Or, get an object that conforms to GTMFetcherAuthorizationProtocol for
    // use with GTMAppAuth and the Google APIs client library.
    id<GTMFetcherAuthorizationProtocol> authorizer = [user fetcherAuthorizer];
}];

Usa el token de acceso para llamar a la API. Para ello, incluye el token de acceso en el encabezado de una solicitud de REST o gRPC (Authorization: Bearer ACCESS_TOKEN), o bien usa el autorizador de la recuperación con la biblioteca cliente de las APIs de Google.