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

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

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

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

Вам необходимо выполнить базовую интеграцию входа в Google .

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

Прежде чем вызывать API Google, проверьте, какие области действия уже были предоставлены вашему приложению, используя свойство 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. } 

Цель-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 чтобы попросить пользователя предоставить вашему приложению дополнительный доступ.

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

Быстрый

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. } 

Цель-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 со свежими токенами.

Чтобы гарантировать, что к вашим вызовам API Google всегда будут прикреплены токены доступа с истекшим сроком действия, оберните вызовы в 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() } 

Цель-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 ) или используя авторизатор выборки с клиентской библиотекой API Google .