Importante: a partir de 1o de maio de 2024, a Apple vai exigir Manifestos de privacidade e assinaturas para apps iOS que usam os SDKs mais usados, incluindo o GoogleSignIn-iOS. Faça upgrade para o GoogleSignIn-iOS v7.1.0 ou mais recente antes de 1o de maio de 2024. Siga nosso guia de upgrade.
Mantenha tudo organizado com as coleções
Salve e categorize o conteúdo com base nas suas preferências.
Alguns Serviços do Google, como Drive, Gmail e muitos outros, oferecem APIs públicas
que você pode usar para criar aplicativos que ajudam os usuários a trabalhar com seus dados nessas
serviços. Para acessar esses serviços, os apps precisam implementar um dos protocolos OAuth 2.0
para obter o consentimento dos usuários e receber tokens de acesso, que concedem
acesso às APIs.
Você pode usar a biblioteca do Login do Google, que implementa o fluxo do OAuth 2.0 para
para receber tokens de acesso para o usuário conectado.
Antes de fazer uma chamada para uma API do Google, verifique quais escopos já foram
concedido ao seu app usando a propriedade grantedScopes de GIDGoogleUser:
NSString*driveScope=@"https://www.googleapis.com/auth/drive.readonly";// Check if the user has granted the Drive scopeif(![user.grantedScopescontainsObject:driveScope]){// request additional drive scope}
Com base no fato de um determinado escopo ter ou não sido concedido pelo usuário, você pode
precisar fazer a solicitação de um escopo adicional para apoiar um determinado
interação.
2. Solicitar escopos adicionais
Se você precisar solicitar escopos adicionais, chame
addScopes:presentingViewController:completion ou
addScopes:presentingWindow:completion para pedir que o usuário conceda ao seu app
acesso adicional.
Por exemplo, para solicitar acesso somente leitura aos arquivos do Drive de um usuário:
Swift
letadditionalScopes=["https://www.googleapis.com/auth/drive.readonly"]guardletcurrentUser=GIDSignIn.sharedInstance.currentUserelse{return;/* Not signed in. */}currentUser.addScopes(additionalScopes,presenting:self){signInResult,erroringuarderror==nilelse{return}guardletsignInResult=signInResultelse{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;[currentUseraddScopes:additionalScopespresentingViewController:selfcompletion:^(GIDSignInResult*_NullablesignInResult,NSError*_Nullableerror){if(error){return;}if(signInResult==nil){return;}// Check if the user granted access to the scopes you requested.}];
3. Fazer uma chamada de API com tokens novos
Para garantir que suas chamadas de API do Google sempre tenham tokens de acesso não expirados
anexado, junte as chamadas em um bloco refreshTokensIfNeededWithCompletion::
Swift
currentUser.refreshTokensIfNeeded{user,erroringuarderror==nilelse{return}guardletuser=userelse{return}// Get the access token to attach it to a REST or gRPC request.letaccessToken=user.accessToken.tokenString// Or, get an object that conforms to GTMFetcherAuthorizationProtocol for// use with GTMAppAuth and the Google APIs client library.letauthorizer=user.fetcherAuthorizer()}
Objective-C
[currentUserrefreshTokensIfNeededWithCompletion:^(GIDGoogleUser*_Nullableuser,NSError*_Nullableerror){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=[userfetcherAuthorizer];}];
Use o token de acesso para chamar a API, incluindo o token de acesso no
o cabeçalho de uma solicitação REST ou gRPC (Authorization: Bearer ACCESS_TOKEN);
ou usando o autorizador do coletor com o
Biblioteca de cliente das APIs do Google.
[[["Fácil de entender","easyToUnderstand","thumb-up"],["Meu problema foi resolvido","solvedMyProblem","thumb-up"],["Outro","otherUp","thumb-up"]],[["Não contém as informações de que eu preciso","missingTheInformationINeed","thumb-down"],["Muito complicado / etapas demais","tooComplicatedTooManySteps","thumb-down"],["Desatualizado","outOfDate","thumb-down"],["Problema na tradução","translationIssue","thumb-down"],["Problema com as amostras / o código","samplesCodeIssue","thumb-down"],["Outro","otherDown","thumb-down"]],["Última atualização 2025-07-25 UTC."],[[["\u003cp\u003eGoogle services like Drive and Gmail offer public APIs for building apps that interact with user data, requiring OAuth 2.0 for user consent and access tokens.\u003c/p\u003e\n"],["\u003cp\u003eBefore making API calls, verify granted scopes using \u003ccode\u003egrantedScopes\u003c/code\u003e and request additional scopes if needed with \u003ccode\u003eaddScopes\u003c/code\u003e.\u003c/p\u003e\n"],["\u003cp\u003eEnsure API calls have unexpired access tokens by wrapping them in \u003ccode\u003erefreshTokensIfNeededWithCompletion\u003c/code\u003e to refresh tokens.\u003c/p\u003e\n"],["\u003cp\u003eAccess tokens can be used directly in REST/gRPC requests or with the Google APIs Client Library for seamless integration.\u003c/p\u003e\n"],["\u003cp\u003eBasic Google Sign-In integration is a prerequisite before using these features.\u003c/p\u003e\n"]]],[],null,["# Access Google APIs in an iOS app\n\nSome Google services, such as Drive, Gmail, and many others, provide public APIs\nthat you can use to create apps that help users work with their data in these\nservices. To access these services, apps must implement one of the OAuth 2.0\nclient flows to get consent from users and obtain *access tokens*, which grant\naccess to the APIs.\n\nYou can use the Google Sign-In library, which implements the OAuth 2.0 flow for\nyou, to get access tokens for the signed-in user.\n\nBefore you begin\n----------------\n\nYou must complete the [basic Google Sign-In integration](/identity/sign-in/ios/sign-in).\n\n1. Check which scopes have been granted\n---------------------------------------\n\nBefore you make a call to a Google API, check which scopes have already been\ngranted to your app, using the `grantedScopes` property of `GIDGoogleUser`: \n\n### Swift\n\n let driveScope = \"https://www.googleapis.com/auth/drive.readonly\"\n let grantedScopes = user.grantedScopes\n if grantedScopes == nil || !grantedScopes!.contains(driveScope) {\n // Request additional Drive scope.\n }\n\n### Objective-C\n\n NSString *driveScope = @\"https://www.googleapis.com/auth/drive.readonly\";\n\n // Check if the user has granted the Drive scope\n if (![user.grantedScopes containsObject:driveScope]) {\n // request additional drive scope\n }\n\nBased on whether or not a certain scope has been granted by the user, you might\nneed to make a request for an additional scope in order to support a particular\ninteraction.\n\n2. Request additional scopes\n----------------------------\n\nIf you need to request additional scopes, call\n`addScopes:presentingViewController:completion` or\n`addScopes:presentingWindow:completion` to ask the user to grant your app\nadditional access.\n\nFor example, to request read-only access to a user's Drive files: \n\n### Swift\n\n let additionalScopes = [\"https://www.googleapis.com/auth/drive.readonly\"]\n guard let currentUser = GIDSignIn.sharedInstance.currentUser else {\n return ; /* Not signed in. */\n }\n\n currentUser.addScopes(additionalScopes, presenting: self) { signInResult, error in\n guard error == nil else { return }\n guard let signInResult = signInResult else { return }\n\n // Check if the user granted access to the scopes you requested.\n }\n\n### Objective-C\n\n NSArray *additionalScopes = @[ @\"https://www.googleapis.com/auth/drive.readonly\" ];\n GIDGoogleUser *currentUser = GIDSignIn.sharedInstance.currentUser;\n\n [currentUser addScopes:additionalScopes\n presentingViewController:self\n completion:^(GIDSignInResult * _Nullable signInResult,\n NSError * _Nullable error) {\n if (error) { return; }\n if (signInResult == nil) { return; }\n\n // Check if the user granted access to the scopes you requested.\n }];\n\n3. Make an API call with fresh tokens\n-------------------------------------\n\nTo ensure that your Google API calls always have unexpired access tokens\nattached, wrap the calls in a `refreshTokensIfNeededWithCompletion:` block: \n\n### Swift\n\n currentUser.refreshTokensIfNeeded { user, error in\n guard error == nil else { return }\n guard let user = user else { return }\n\n // Get the access token to attach it to a REST or gRPC request.\n let accessToken = user.accessToken.tokenString\n\n // Or, get an object that conforms to GTMFetcherAuthorizationProtocol for\n // use with GTMAppAuth and the Google APIs client library.\n let authorizer = user.fetcherAuthorizer()\n }\n\n### Objective-C\n\n [currentUser refreshTokensIfNeededWithCompletion:^(\n GIDGoogleUser * _Nullable user,\n NSError * _Nullable error) {\n if (error) { return; }\n if (user == nil) { return; }\n\n // Get the access token to attach it to a REST or gRPC request.\n NSString *accessToken = user.accessToken.tokenString;\n\n // Or, get an object that conforms to GTMFetcherAuthorizationProtocol for\n // use with GTMAppAuth and the Google APIs client library.\n id\u003cGTMFetcherAuthorizationProtocol\u003e authorizer = [user fetcherAuthorizer];\n }];\n\nUse the access token to call the API, by either including the access token in\nthe header of a REST or gRPC request (`Authorization: Bearer `\u003cvar translate=\"no\"\u003eACCESS_TOKEN\u003c/var\u003e),\nor by using the fetcher authorizer with the\n[Google APIs Client Library](https://github.com/google/google-api-objectivec-client-for-rest/)."]]