Доступ к API Google в приложении iOS

Некоторые сервисы Google, такие как Drive, Gmail и многие другие, предоставляют общедоступные API, которые можно использовать для создания приложений, помогающих пользователям работать с данными в этих сервисах. Для доступа к этим сервисам приложения должны реализовать один из потоков клиента OAuth 2.0, чтобы получить согласие пользователей и получить токены доступа , которые предоставляют доступ к API.

Для получения токенов доступа для авторизованного пользователя можно использовать библиотеку Google Sign-In, которая реализует протокол OAuth 2.0.

Прежде чем начать

Вам необходимо завершить базовую интеграцию с Google Sign-In .

1. Проверьте, какие области действия были предоставлены.

Прежде чем обращаться к API Google, проверьте, какие области действия (scopes) уже предоставлены вашему приложению, используя свойство grantedScopes объекта GIDGoogleUser :

Быстрый

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
}

В зависимости от того, предоставлена ​​ли пользователем определенная область действия, вам может потребоваться запросить дополнительную область действия для поддержки конкретного взаимодействия.

2. Запросить дополнительные области применения.

Если вам необходимо запросить дополнительные области доступа, вызовите addScopes:presentingViewController:completion или addScopes:presentingWindow:completion чтобы попросить пользователя предоставить вашему приложению дополнительный доступ.

Например, чтобы запросить доступ только для чтения к файлам пользователя в Google Диске:

Быстрый

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 с новыми токенами.

Чтобы гарантировать, что к вашим вызовам Google API всегда будут прикреплены действующие токены доступа, оберните вызовы в блок refreshTokensIfNeededWithCompletion:

Быстрый

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

Используйте токен доступа для вызова API, либо включив его в заголовок REST- или gRPC-запроса ( Authorization: Bearer ACCESS_TOKEN ), либо используя авторизатор fetcher из клиентской библиотеки Google API .