Accede a las API de Google en una app para iOS

Algunos servicios de Google, como Drive, Gmail y muchos otros, proporcionan API 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 de 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 del Acceso con Google.

1. Verifica qué alcances se otorgaron

Antes de realizar una llamada a una API de Google, comprueba qué alcances ya se otorgaron a la app con 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ó un alcance determinado, es posible que debas realizar una solicitud para obtener un alcance adicional a fin de admitir una interacción en particular.

2. Solicitar permisos adicionales

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

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

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 sin vencer adjuntos, 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 a fin de 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 usa el autorizador de obtención con la biblioteca cliente de las API de Google.