Auf Google APIs in einer iOS-App zugreifen

Einige Google-Dienste wie Drive, Gmail und viele andere bieten öffentliche APIs, mit denen Sie Anwendungen erstellen können, die Nutzern die Arbeit mit ihren Daten in diesen Diensten erleichtern. Für den Zugriff auf diese Dienste müssen Anwendungen einen der OAuth 2.0-Clientflüsse implementieren, um die Zustimmung der Nutzer zu erhalten und Zugriffstokens zu erhalten, die Zugriff auf die APIs gewähren.

Sie können die Google Log-in-Bibliothek verwenden, die den OAuth 2.0-Vorgang für Sie implementiert, um Zugriffstokens für den angemeldeten Nutzer abzurufen.

Hinweis

Sie müssen die grundlegende Integration von Google Log-in durchführen.

1. Zugelassene Bereiche prüfen

Bevor Sie eine Google API aufrufen, prüfen Sie mit dem Attribut grantedScopes von GIDGoogleUser, welche Bereiche Ihrer App bereits gewährt wurden:

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
}

Je nachdem, ob der Nutzer einen bestimmten Bereich erteilt hat oder nicht, müssen Sie möglicherweise eine Anfrage für einen zusätzlichen Bereich stellen, um eine bestimmte Interaktion zu unterstützen.

2. Zusätzliche Bereiche anfordern

Wenn Sie zusätzliche Bereiche anfordern möchten, rufen Sie addScopes:presentingViewController:completion oder addScopes:presentingWindow:completion auf, um den Nutzer zu bitten, Ihrer Anwendung zusätzlichen Zugriff zu gewähren.

So fordern Sie beispielsweise Lesezugriff auf die Drive-Dateien eines Nutzers an:

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. API-Aufruf mit neuen Tokens durchführen

Damit Ihren Google API-Aufrufen immer abgelaufene Zugriffstokens angehängt sind, umschließen Sie die Aufrufe in einem refreshTokensIfNeededWithCompletion:-Block:

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];
}];

Verwenden Sie das Zugriffstoken, um die API aufzurufen. Fügen Sie dazu entweder das Zugriffstoken in den Header einer REST- oder gRPC-Anfrage (Authorization: Bearer ACCESS_TOKEN) ein oder verwenden Sie den Abrufautor mit der Google APIs-Clientbibliothek.