在 iOS 应用中访问 Google API

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

某些 Google 服务(例如云端硬盘、Gmail 和许多其他服务)提供了公共 API,您可以使用这些 API 创建用户在这些服务中处理数据的应用。如需访问这些服务,应用必须实现其中一个 OAuth 2.0 客户端流程,以征得用户同意,并获取可授予 API 访问权限的访问令牌

您可以使用 Google 登录库(它会为您实现 OAuth 2.0 流程)来获取已登录用户的访问令牌。

准备工作

您必须完成基本的 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:callbackaddScopes:presentingWindow:callback 以要求用户授予您的应用额外的访问权限。

举例来说,如要请求对用户的云端硬盘的只读权限,请按以下步骤操作:

Swift

let additionalScopes = ["https://www.googleapis.com/auth/drive.readonly"]
GIDSignIn.sharedInstance.addScopes(additionalScopes, presenting: self) { user, error in
    guard error == nil else { return }
    guard let user = user else { return }

    // Check if the user granted access to the scopes you requested.
}

Objective-C

NSArray *additionalScopes = @[ @"https://www.googleapis.com/auth/drive.readonly" ];
[GIDSignIn.sharedInstance addScopes:additionalScopes
           presentingViewController:self
                           callback:^(GIDGoogleUser * _Nullable user,
                                      NSError * _Nullable error) {
    if (error) { return; }
    if (user == nil) { return; }

    // Check if the user granted access to the scopes you requested.
}];

3.使用新令牌进行 API 调用

为确保您的 Google API 调用始终附加未过期的访问令牌,请将这些调用封装在 doWithFreshTokens: 块中:

Swift

user.authentication.do { authentication, error in
    guard error == nil else { return }
    guard let authentication = authentication else { return }

    // Get the access token to attach it to a REST or gRPC request.
    let accessToken = authentication.accessToken

    // Or, get an object that conforms to GTMFetcherAuthorizationProtocol for
    // use with GTMAppAuth and the Google APIs client library.
    let authorizer = authentication.fetcherAuthorizer()
}

Objective-C

[user.authentication doWithFreshTokens:^(GIDAuthentication * _Nullable authentication,
                                         NSError * _Nullable error) {
    if (error) { return; }
    if (authentication == nil) { return; }

    // Get the access token to attach it to a REST or gRPC request.
    NSString *accessToken = authentication.accessToken;

    // Or, get an object that conforms to GTMFetcherAuthorizationProtocol for
    // use with GTMAppAuth and the Google APIs client library.
    id<GTMFetcherAuthorizationProtocol> authorizer = [authentication fetcherAuthorizer];
}];

您可以使用访问令牌调用 API,具体方法是:在 REST 或 gRPC 请求的标头 (Authorization: Bearer ACCESS_TOKEN) 中添加访问令牌,或者使用提取器授权方和 Google API 客户端库