iOS アプリで Google API にアクセスする

ドライブや Gmail などの一部の Google サービスでは、公開 API を提供しています。 ユーザーのデータ操作を支援するアプリの作成に使用できる 提供します。これらのサービスにアクセスするには、アプリで OAuth 2.0 ユーザーの同意を得て、アクセス トークンを取得する(付与する) 制限します。

Google ログイン ライブラリを使用すると、 ログイン ユーザーのアクセス トークンを取得します。

始める前に

Google ログインの基本的な統合を完了している必要があります。

1. 付与されているスコープを確認する

Google API を呼び出す前に、すでに設定されているスコープを確認してください。 GIDGoogleUsergrantedScopes プロパティを使用して、アプリに付与します。

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
}

ユーザーによって特定のスコープが付与されているかどうかに基づいて、 特定のユースケースをサポートするためには、追加のスコープの です。

2. 追加のスコープをリクエストする

追加のスコープをリクエストする必要がある場合は、 addScopes:presentingViewController:completion または addScopes:presentingWindow:completion: ユーザーにアプリを許可するよう求める できます。

たとえば、ユーザーのドライブ ファイルへの読み取り専用アクセスをリクエストするには、次のようにします。

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 呼び出しを行う

Google API 呼び出しに有効期限内のアクセス トークンが常に含まれるようにする 呼び出しを 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];
}];

そのアクセス トークンを使用して API を呼び出すには、 REST または gRPC リクエストのヘッダー(Authorization: Bearer ACCESS_TOKEN) フェッチャーオーサライザを Google API クライアント ライブラリ