Mit einer iOS-App auf Google APIs zugreifen

Einige Google-Dienste wie Drive, Gmail und viele andere bieten öffentliche APIs, mit denen Sie Apps erstellen können, die Nutzern helfen, mit ihren Daten in diesen Diensten zu arbeiten. Um auf diese Dienste zuzugreifen, müssen Apps einen der OAuth 2.0 Clientflows implementieren, um die Einwilligung der Nutzer einzuholen und Zugriffstokens zu erhalten, die den Zugriff auf die APIs gewähren.

Mit der Google Log-in-Bibliothek, die den OAuth 2.0-Vorgang für Sie implementiert, können Sie Zugriffstokens für den angemeldeten Nutzer abrufen.

Hinweis

Sie müssen die grundlegende Google Log-in-Integration abschließen.

1. Prüfen, welche Bereiche gewährt wurden

Bevor Sie einen Aufruf an eine Google API senden, prüfen Sie mit der Eigenschaft 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 ein bestimmter Bereich vom Nutzer gewährt wurde oder nicht, müssen Sie möglicherweise einen zusätzlichen Bereich anfordern, um eine bestimmte Interaktion zu unterstützen.

2. Zusätzliche Bereiche anfordern

Wenn Sie zusätzliche Zugriffsbereiche anfordern müssen, rufen Sie addScopes:presentingViewController:completion oder addScopes:presentingWindow:completion auf, um den Nutzer zu bitten, Ihrer App zusätzlichen Zugriff zu gewähren.

So fordern Sie beispielsweise schreibgeschützten Zugriff 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 Ihre Google API-Aufrufe immer mit nicht abgelaufenen Zugriffstokens versehen sind, schließen Sie die Aufrufe in einen refreshTokensIfNeededWithCompletion:-Block ein:

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

Rufen Sie die API mit dem Zugriffstoken auf. Dazu können Sie das Zugriffstoken entweder in den Header einer REST- oder gRPC-Anfrage einfügen (Authorization: Bearer ACCESS_TOKEN), oder den Fetcher-Autorisierer mit der Google APIs-Clientbibliothek verwenden.