Accedi alle API di Google in un'app per iOS

Alcuni servizi Google, come Drive, Gmail e molti altri, forniscono API pubbliche che puoi utilizzare per creare app che aiutano gli utenti a lavorare con i propri dati in questi servizi. Per accedere a questi servizi, le app devono implementare uno dei flussi client OAuth 2.0 per ottenere il consenso degli utenti e i token di accesso, che concedono l'accesso alle API.

Puoi utilizzare la libreria Accedi con Google, che implementa il flusso OAuth 2.0 per te, per ottenere i token di accesso per l'utente che ha eseguito l'accesso.

Prerequisiti

Prima che la tua app per iOS possa chiamare le API di Google, completa i seguenti passaggi di configurazione:

1. Abilita le API per il tuo progetto

Qualsiasi applicazione che chiama le API di Google deve abilitarle nella console Google Cloud.

Per abilitare un'API per il tuo progetto:

  1. Apri la libreria API nella console Google Cloud.
  2. Se richiesto, seleziona un progetto o creane uno nuovo.
  3. Seleziona l'API che vuoi abilitare, quindi fai clic su Abilita.

2. Crea le credenziali di autorizzazione

Qualsiasi applicazione per iOS che utilizza OAuth 2.0 per accedere alle API di Google deve disporre di credenziali di autorizzazione che la identificano presso il server di autorizzazione di Google. I passaggi seguenti spiegano come creare le credenziali per il tuo progetto:

  1. Vai alla pagina Credenziali nella console Google Cloud.
  2. Fai clic su Crea client (o Crea credenziali > ID client OAuth).
  3. Seleziona il tipo di applicazione iOS.
  4. Inserisci un nome per il client OAuth. Questo nome identifica il client nella pagina Credenziali del progetto.
  5. Inserisci l'identificatore pacchetto della tua app. L'ID pacchetto è il valore della chiave CFBundleIdentifier nel file Info.plist dell'app. Il valore viene comunemente visualizzato nel riquadro Generale o nel riquadro Firma e funzionalità dell'editor di progetti Xcode oppure nella pagina Informazioni sull'app in Apple App Store Connect. Verifica di utilizzare l'ID pacchetto corretto, in quanto non può essere modificato se utilizzi App Check.
  6. (Facoltativo) Inserisci l'ID App Store della tua app se è pubblicata nell'Apple App Store. L'ID store è una stringa numerica inclusa in ogni URL dell'App Store di Apple.
  7. (Facoltativo) Inserisci l'ID team. Consulta la sezione Trova l'ID team nella documentazione dell'account sviluppatore Apple. L'ID team è obbligatorio se attivi App Check per il tuo client.
  8. (Facoltativo) Attiva App Check per la tua app per iOS. Quando attivi App Check, viene utilizzato il servizio App Attest di Apple per verificare che le richieste OAuth 2.0 provenienti dal tuo client OAuth siano autentiche e provengano dalla tua app, contribuendo a ridurre il rischio di furto d'identità dell'app.
  9. Fai clic su Crea.

L'ID client viene generato e visualizzato nella console Google Cloud. Aggiungi lo schema URL dell'ID client invertito (ad esempio com.googleusercontent.apps.1234567890-abcdef) al file Info.plist della tua app per gestire i reindirizzamenti di autorizzazione.

3. Completa l'integrazione di base di Accedi con Google

Completa l'integrazione di base di Accedi con Google prima di richiedere ambiti incrementali e chiamare le API di Google.

1. Controlla quali ambiti sono stati concessi

Prima di effettuare una chiamata a un'API di Google, controlla quali ambiti sono già stati concessi alla tua app utilizzando la proprietà grantedScopes di 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
}

A seconda che un determinato ambito sia stato concesso o meno dall'utente, potresti dover richiedere un ambito aggiuntivo per supportare una determinata interazione.

2. Richiedi ambiti aggiuntivi

Se devi richiedere ambiti aggiuntivi, chiama addScopes:presentingViewController:completion o addScopes:presentingWindow:completion per chiedere all'utente di concedere alla tua app l'accesso aggiuntivo.

Ad esempio, per richiedere l'accesso di sola lettura ai file di Drive di un utente:

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. Esegui una chiamata API con token aggiornati

Per assicurarti che le chiamate API di Google abbiano sempre token di accesso non scaduti, inserisci le chiamate in un blocco 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];
}];

Utilizza il token di accesso per chiamare l'API, includendolo nell'intestazione di una richiesta REST o gRPC (Authorization: Bearer ACCESS_TOKEN) o utilizzando l'autorizzatore del recuperatore con la libreria client delle API di Google.