Depois de ativar o faturamento e criar uma chave de API, estará tudo pronto para configurar o projeto Xcode usado para desenvolver seu app.
As notas da versão estão disponíveis para cada versão.
Etapa 1: instalar o software necessário
Para criar um projeto usando o SDK do Places para iOS, você precisa de:
- Xcode versão 15.0 ou mais recente
Etapa 2: criar o projeto Xcode e instalar o SDK do Places para iOS
Gerenciador de pacotes do Swift
O SDK do Places para iOS pode ser instalado usando o Gerenciador de pacotes do Swift. Para adicionar o SDK, verifique se você removeu todas as dependências atuais do SDK do Places para iOS.
Para adicionar o SDK a um projeto novo ou existente, siga estas etapas:
-
Abra o Xcode
project
ouworkspace
e acesse File > Add Package Dependencies. - Digite https://github.com/googlemaps/ios-places-sdk como o URL, pressione Enter para extrair o pacote e clique em "Adicionar pacote".
-
Para instalar um
version
específico, defina o campo Regra de dependência como uma das opções baseadas em versão. Para novos projetos, recomendamos especificar a versão mais recente e usar a opção "Versão exata". Quando terminar, clique em "Adicionar pacote". -
Na janela Choose Package Products, verifique se
GooglePlaces
vai ser adicionado ao destinomain
designado. Quando terminar, clique em "Adicionar pacote". -
Para verificar a instalação, navegue até o painel
General
do destino. Em Frameworks, bibliotecas e conteúdo incorporado, você encontra os pacotes instalados. Você também pode ver a seção "Dependências de pacotes" do "Navegador do projeto" para verificar o pacote e a versão dele.
Para atualizar o package
de um projeto existente, siga estas etapas:
Se você estiver fazendo upgrade de uma versão anterior à 9.0.0, precisará remover as seguintes dependências:
GoogleMapsBase
,GoogleMapsCore
eGoogleMapsM4B
após o upgrade. Não remova a dependência deGoogleMaps
. Para mais informações, consulte as Notas de lançamento da versão 9.0.0.Nas configurações do projeto do Xcode, encontre Frameworks, bibliotecas e conteúdo incorporado. Use o sinal de menos(-) para remover o seguinte framework:
GoogleMapsBase
(apenas para upgrades de versões anteriores à 9.0.0)GoogleMapsCore
(apenas para upgrades de versões anteriores à 9.0.0)GoogleMapsM4B
(apenas para upgrades de versões anteriores à 9.0.0)
- No Xcode, acesse "File > Packages > Update To latest Package Versions".
- Para verificar a instalação, vá para a seção Dependências de pacotes do Navegador do projeto para verificar o pacote e a versão dele.
Para remover as dependências atuais do SDK do Places para iOS adicionadas usando CocoaPods
, siga estas etapas:
- Feche o espaço de trabalho do Xcode. Abra o terminal e execute o seguinte comando:
sudo gem install cocoapods-deintegrate cocoapods-clean pod deintegrate pod cache clean --all
-
Remova
Podfile
,Podfile.resolved
eworkspace
do Xcode se eles não forem usados para outra finalidade que não seja CocoaPods.
-
Nas configurações do projeto do Xcode, encontre Frameworks, bibliotecas e conteúdo incorporado. Use o sinal de menos(-) para remover o seguinte framework:
GooglePlaces.xcframework
-
No diretório de nível superior do seu projeto Xcode, remova o pacote
GooglePlaces
.
CocoaPods
O SDK do Places para iOS está disponível como um pod do CocoaPod, GooglePlaces, que contém todos os recursos do Places.
O CocoaPods é um gerenciador de dependências de código aberto para projetos Cocoa em Swift e Objective-C. Se você ainda não tem a ferramenta CocoaPods, instale-a no macOS executando o comando a seguir no terminal. Para mais detalhes, consulte o Guia de primeiros passos do CocoaPods (em inglês).
sudo gem install cocoapods
Crie um Podfile
para o SDK do Places para iOS e instale o SDK e as dependências dele:
- Se você ainda não tiver um projeto Xcode, crie um agora e salve-o no computador local. Se você tem pouca experiência com desenvolvimento para iOS, crie um novo projeto e selecione o Modelo de app iOS.
- Crie um arquivo chamado
Podfile
no seu diretório do projeto para definir as dependências. - Edite o
Podfile
e adicione as dependências com as versions. Este é um exemplo que especifica o nome do destino do aplicativo e o nome do podGooglePlaces
:source 'https://github.com/CocoaPods/Specs.git' platform :ios, '15.0' target 'YOUR_APPLICATION_TARGET_NAME_HERE' do pod 'GooglePlaces', '8.3.0' end
Executepod outdated
regularmente para detectar quando houver uma versão mais recente e garantir que você esteja sempre atualizado. - Salve o
Podfile
. Abra um terminal e acesse o diretório que contém o
Podfile
:cd <path-to-project>
Execute o comando
pod install
. Isso instalará as APIs especificadas noPodfile
e as respectivas dependências.pod install
Feche o Xcode e clique duas vezes no arquivo
.xcworkspace
do projeto para iniciar o programa. Depois disso, é preciso usar o arquivo.xcworkspace
para abrir o projeto.
Para atualizar a API de um projeto existente, siga estas etapas:
- Abra um terminal e acesse o diretório do projeto que contém o
Podfile
. - Execute o comando
pod update
. Isso vai atualizar todas as APIs especificadas noPodfile
para a versão mais recente.
Instalação manual
Este guia mostra como adicionar manualmente o XCFramework que contém o SDK do Places para iOS ao seu projeto e como definir as configurações de build no Xcode. Um XCFramework é um pacote binário que pode ser usado em várias plataformas, incluindo máquinas que usam o Apple Silicon.
- Faça o download dos seguintes arquivos binários e de recursos do SDK:
- Extraia os arquivos para acessar o XCFramework e os recursos.
- Inicialize o Xcode e abra ou crie um projeto. Se você tem pouca experiência com desenvolvimento para iOS, crie um novo projeto e selecione o Modelo de app iOS.
- Remova todas as versões anteriores do Maps do projeto.
-
Abra a guia Geral. Arraste o XCFramework a seguir para seu projeto em Frameworks, bibliotecas e conteúdo incorporado. Selecione
Não incorporar:
GooglePlaces.xcframework
Arraste -
Copie o
GooglePlaces.bundle
do GooglePlacesResources salvo no diretório de nível superior do projeto do Xcode. Selecione Copy items into destination group's folder quando solicitado. - Selecione o projeto no Navegador de projetos e escolha o destino do aplicativo.
-
Abra a guia Fases de compilação. Em Vincular binário a bibliotecas, adicione os seguintes frameworks e bibliotecas:
CoreGraphics.framework
CoreLocation.framework
libc++.tbd
libz.tbd
QuartzCore.framework
UIKit.framework
-
Escolha seu projeto, em vez de um destino específico, e abra a guia Build Settings. Na seção Vinculação - Geral -> Outras sinalizações do vinculador, adicione
-ObjC
a "Depurar" e "Liberar". Se essas configurações não estiverem visíveis, mude o filtro na barra Build Settings de Basic para All.
GooglePlaces.bundle
dos GooglePlacesResources transferidos por download
GooglePlacesSwift
Você pode instalar o SDK GooglePlacesSwift (pré-lançamento) usando o Gerenciador de pacotes do Swift, o CocoaPods e manualmente. As etapas de instalação em todos os processos são iguais às descritas no SDK do Places para iOS, com as seguintes diferenças:
- O Xcode 15.3 é obrigatório.
- No Gerenciador de pacotes do Swift, também substitua as instâncias
GooglePlaces
porGooglePlacesSwift
. Isso inclui instruções de importação. - Atualize o número da versão para 0.1.0.
- Substitua as instâncias de https://github.com/googlemaps/ios-places-sdk por https://github.com/googlemaps/ios-places-swift-sdk.
- Se estiver fazendo a instalação manualmente, você precisará adicionar o XCFramework
GooglePlacesSwift
e os arquivos de recursos, além do XCFramework e dos arquivos de recursos GooglePlaces.
Por exemplo, se estiver usando CocoaPods, o Podfile
editado será o seguinte:
source 'https://github.com/CocoaPods/Specs.git' platform :ios, '15.3' target 'YOUR_APPLICATION_TARGET_NAME_HERE' do pod 'GooglePlacesSwift', '0.1.0' end
Etapa 3: inspecionar o arquivo de manifesto de privacidade da Apple
A Apple exige detalhes de privacidade para apps na App Store. Acesse a página de detalhes de privacidade da App Store da Apple para ver atualizações e mais informações.
O arquivo de Manifesto de privacidade da Apple está incluído no pacote de recursos do SDK. Para verificar se o arquivo de manifesto de privacidade foi incluído e inspecionar o conteúdo dele, crie um arquivo do app e gere um relatório de privacidade com base nele.
Etapa 4: adicionar a chave de API ao app
Nos exemplos a seguir, substitua YOUR_API_KEY
pela chave de API.
Swift
Inclua sua chave de API ao AppDelegate.swift
da seguinte maneira:
- Adicione a seguinte instrução de importação:
import GooglePlaces
- Adicione o seguinte ao método
application(_:didFinishLaunchingWithOptions:)
, substituindo YOUR_API_KEY pela chave de API:GMSPlacesClient.provideAPIKey("YOUR_API_KEY")
Objective-C
Inclua sua chave de API ao AppDelegate.m
da seguinte maneira:
- Adicione a seguinte instrução de importação:
@import GooglePlaces;
- Adicione o seguinte ao método
application:didFinishLaunchingWithOptions:
, substituindo YOUR_API_KEY pela chave de API:[GMSPlacesClient provideAPIKey:@"YOUR_API_KEY"];
GooglePlacesSwift
Inclua sua chave de API ao AppDelegate.swift
da seguinte maneira:
- Adicione a seguinte instrução de importação:
import GooglePlacesSwift
- Adicione o seguinte ao método
application(_:didFinishLaunchingWithOptions:)
, substituindo YOUR_API_KEY pela chave de API:PlacesClient.shared.provideAPIKey("YOUR_API_KEY")
Etapa 5: começar a escrever o código
Os exemplos de código a seguir demonstram como acessar o local atual.
Swift
import GooglePlaces import UIKit class GetStartedViewController : UIViewController { // Add a pair of UILabels in Interface Builder, and connect the outlets to these variables. @IBOutlet private var nameLabel: UILabel! @IBOutlet private var addressLabel: UILabel! private var placesClient: GMSPlacesClient! override func viewDidLoad() { super.viewDidLoad() placesClient = GMSPlacesClient.shared() } // Add a UIButton in Interface Builder, and connect the action to this function. @IBAction func getCurrentPlace(_ sender: UIButton) { let placeFields: GMSPlaceField = [.name, .formattedAddress] placesClient.findPlaceLikelihoodsFromCurrentLocation(withPlaceFields: placeFields) { [weak self] (placeLikelihoods, error) in guard let strongSelf = self else { return } guard error == nil else { print("Current place error: \(error?.localizedDescription ?? "")") return } guard let place = placeLikelihoods?.first?.place else { strongSelf.nameLabel.text = "No current place" strongSelf.addressLabel.text = "" return } strongSelf.nameLabel.text = place.name strongSelf.addressLabel.text = place.formattedAddress } } }
Objective-C
#import "GetStartedViewController.h" @import GooglePlaces; @interface GetStartedViewController () // Add a pair of UILabels in Interface Builder and connect the outlets to these variables @property (weak, nonatomic) IBOutlet UILabel *nameLabel; @property (weak, nonatomic) IBOutlet UILabel *addressLabel; @end @implementation GetStartedViewController { GMSPlacesClient *_placesClient; } - (void)viewDidLoad { [super viewDidLoad]; _placesClient = [GMSPlacesClient sharedClient]; } // Add a pair of UILabels in Interface Builder and connect the outlets to these variables. - (IBAction)getCurrentPlace:(UIButton *)sender { GMSPlaceField placeFields = (GMSPlaceFieldName | GMSPlaceFieldFormattedAddress); __weak typeof(self) weakSelf = self; [_placesClient findPlaceLikelihoodsFromCurrentLocationWithPlaceFields:placeFields callback:^(NSArray<GMSPlaceLikelihood *> * _Nullable likelihoods, NSError * _Nullable error) { __typeof__(self) strongSelf = weakSelf; if (strongSelf == nil) { return; } if (error != nil) { NSLog(@"An error occurred %@", [error localizedDescription]); return; } GMSPlace *place = likelihoods.firstObject.place; if (place == nil) { strongSelf.nameLabel.text = @"No current place"; strongSelf.addressLabel.text = @""; return; } strongSelf.nameLabel.text = place.name; strongSelf.addressLabel.text = place.formattedAddress; }]; } @end
GooglePlacesSwift
struct ContentView: View { @State var place: Place? var body: some View { Button("Get Place") { // A hotel in Saigon with an attribution. let placeID = "ChIJV4k8_9UodTERU5KXbkYpSYs" let fetchPlaceRequest = FetchPlaceRequest( placeID: placeID, placeProperties: [.displayName, .formattedAddress] ) Task { switch await placesClient.fetchPlace(with: fetchPlaceRequest) { case .success(let place): self.place = place case .failure(let placesError): // Handle error } Text(swiftPlace?.displayName ?? "No place yet") .padding() Text(swiftPlace?.formattedAddress ?? "No place yet") .padding() } }
Próximas etapas
Depois que o projeto estiver configurado, explore os apps de exemplo (link em inglês).