Sigas as etapas deste guia para baixar a Google Places API for iOS, adicionar a biblioteca e suas dependências ao aplicativo e obter uma chave de API gratuita.
As notas da versão estão disponíveis para todas as versões.
Etapa 1: obter a versão mais recente do Xcode
Para criar um projeto usando a Google Places API for iOS, é necessário usar a versão 7.3 ou posterior do Xcode.
Etapa 2: instalar a API
Usar CocoaPods
A Google Places API for iOS está disponível como dois pods do CocoaPod. O primeiro desses pods, GooglePlaces, contém todas as funcionalidades de locais que não precisam de um mapa (APIs programáticas e o widget de preenchimento automático da IU), e o GooglePlacePicker é um pod separado que contém um widget para pesquisar e selecionar um local em um mapa.
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 essa ferramenta, instale-a no macOS executando o seguinte comando no terminal. Para saber mais, consulte o guia de primeiros passos do CocoaPods.
sudo gem install cocoapods
Crie um Podfile para a Google Places API for iOS e use-o para instalar a API e suas dependências:
- Se 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 Single View Application)
- Crie um arquivo chamado
Podfileno diretório do projeto. Esse arquivo define as dependências do projeto. - Edite o
Podfilee adicione suas dependências. Veja este exemplo que especifica o nome de destino do aplicativo e os nomes dos dois pods fornecidos com a Places API for iOS (GooglePlacePickereGoogleMapssomente serão necessários se você usar o exemplo de seletor de local):source 'https://github.com/CocoaPods/Specs.git' target 'YOUR_APPLICATION_TARGET_NAME_HERE' do pod 'GooglePlaces' pod 'GooglePlacePicker' pod 'GoogleMaps' end
- 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. Assim, você instalará as APIs especificadas noPodfilejunto com as respectivas dependências.pod install
Feche o Xcode e clique duas vezes para abrir o arquivo
.xcworkspacedo projeto e iniciar o Xcode. A partir desse momento, será preciso usar o arquivo.xcworkspacepara abrir o projeto.
Instalar manualmente
Este guia mostra como adicionar manualmente o framework GooglePlaces ao projeto e ajustar as configurações de compilação no Xcode.
- Baixe os arquivos de origem do SDK:
O GooglePlacePicker-2.0.1 somente será necessário se o seletor de local estiver sendo usado.
- Descompacte os arquivos de origem.
- Inicialize o Xcode e abra ou crie um projeto. Se você tem pouca experiência com o iOS, crie um Single View Application, desative Use Storyboards e ative Use Automatic Reference Counting.
- Remova todas as versões anteriores do Maps do projeto.
- Arraste os pacotes a seguir para o seu projeto (quando aparecer a tela de confirmação, selecione Copy items if needed):
GooglePlaces-2.0.1/Frameworks/GooglePlaces.frameworkGoogleMaps-2.0.1/Subspecs/Base/Frameworks/GoogleMapsBase.framework
Se você estiver usando o seletor de local, arraste os pacotes a seguir para o projeto (além dos pacotes listados anteriormente):
GooglePlacePicker-2.0.1/Frameworks/GooglePlacePicker.frameworkGoogleMaps-2.0.1/Subspecs/Maps/Frameworks/GoogleMapsCore.frameworkGoogleMaps-2.0.1/Subspecs/Maps/Frameworks/GoogleMaps.framework
- Clique com o botão direito em
GooglePlaces.frameworkno projeto e selecione Show In Finder. - Arraste
GooglePlaces.bundleda pastaResourcespara o projeto. Quando aparecer a tela de confirmação, certifique-se de que a opção Copy items into destination group’s folder não esteja selecionada. - Se você estiver usando o seletor de local, repita a etapa anterior e arraste os arquivos de
GoogleMaps.bundleeGooglePlacePicker.bundlepara o projeto. Esses arquivos podem ser encontrados emGoogleMaps.frameworkeGooglePlacePicker.framework, respectivamente. - Selecione o projeto no Project Navigator e escolha o local de destino do aplicativo.
- Abra a guia Build Phases e, dentro de Link Binary with Libraries, adicione os seguintes frameworks:
GooglePlaces.frameworkGoogleMapsBase.frameworkGooglePlacePicker.framework(somente se o seletor de local estiver sendo usado)GoogleMapsCore.framework(somente se o seletor de local estiver sendo usado)GoogleMaps.framework(somente se o seletor de local estiver sendo usado)Accelerate.frameworkCoreData.frameworkCoreGraphics.frameworkCoreLocation.frameworkCoreText.frameworkGLKit.frameworkImageIO.frameworklibc++.tbdlibz.tbdOpenGLES.frameworkQuartzCore.frameworkSystemConfiguration.frameworkUIKit.framework
Escolha o seu projeto, em vez de um destino específico, e abra a guia Build Settings.
- Na seção Other Linker Flags, adicione
-ObjC. Se essas configurações não estiverem visíveis, altere o filtro da barra Build Settings de Basic para All.
Etapa 3: obter uma chave de API
Para começar a usar o Google Places API for iOS, clique no botão abaixo e acesse um guia do processo de ativação do Google Places API for iOS e de obtenção de uma chave de API.
Obter uma chaveComo alternativa, siga as etapas a seguir para obter uma chave de API:
- Acesse o Google API Console.
- Crie ou selecione um projeto.
- Clique em Continue para ativar o Google Places API for iOS.
- Na página Credentials, obtenha uma chave de API.
Observação: Se você tem uma chave restrita ao iOS, use-a. É possível usar a mesma chave com todos os aplicativos iOS dentro do mesmo projeto. - Na caixa de diálogo que exibe a chave de API, selecione Restrict key para adicionar uma restrição para iOS à chave de API.
- Na seção Restrictions, selecione iOS apps e digite o identificador geral do seu aplicativo. Exemplo:
com.example.helloplaces. - Clique em Save.
A nova chave para iOS é exibida na lista de chaves de API do projeto. Uma chave de API é uma string de caracteres, similar a:
AIzaSyBdVl-cTICSwYKrZ95SuvNw7dbMuDt1KG0
Também é possível procurar uma chave existente no Google API Console.
Para saber mais sobre como usar o Google API Console, consulte a Ajuda do API Console.
Etapa 4: adicionar a chave de API ao aplicativo
Os exemplos de código a seguir mostram como adicionar a chave de API a um aplicativo.
Adicione a chave de API ao AppDelegate.swift da seguinte forma:
- Adicione a seguinte declaração import:
import GooglePlaces
- Adicione o item a seguir ao método
application(_:didFinishLaunchingWithOptions:)do aplicativo, substituindo YOUR_API_KEY pela chave de API:GMSPlacesClient.provideAPIKey("YOUR_API_KEY")
Adicione sua chave de API ao AppDelegate.m da seguinte maneira:
- Adicione a seguinte declaração import:
@import GooglePlaces;
- Adicione o item a seguir ao método
application:didFinishLaunchingWithOptions:, substituindo YOUR_API_KEY pela chave de API:[GMSPlacesClient provideAPIKey:@"YOUR_API_KEY"];
Etapa 5: começar a escrever o código
Os exemplos de código a seguir demonstram como obter o local atual e adicionar um widget de IU de seletor de local ao aplicativo.
Obter local atual
Swift
import UIKit
import GooglePlaces
class ViewController: UIViewController {
var placesClient: GMSPlacesClient!
// Add a pair of UILabels in Interface Builder, and connect the outlets to these variables.
@IBOutlet var nameLabel: UILabel!
@IBOutlet var addressLabel: UILabel!
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) {
placesClient.currentPlace(callback: { (placeLikelihoodList, error) -> Void in
if let error = error {
print("Pick Place error: \(error.localizedDescription)")
return
}
self.nameLabel.text = "No current place"
self.addressLabel.text = ""
if let placeLikelihoodList = placeLikelihoodList {
let place = placeLikelihoodList.likelihoods.first?.place
if let place = place {
self.nameLabel.text = place.name
self.addressLabel.text = place.formattedAddress?.components(separatedBy: ", ")
.joined(separator: "\n")
}
}
})
}
}
Objective-C
#import "ViewController.h"
@import GooglePlaces;
@interface ViewController ()
// 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 ViewController {
GMSPlacesClient *_placesClient;
}
- (void)viewDidLoad {
[super viewDidLoad];
_placesClient = [GMSPlacesClient sharedClient];
}
// Add a UIButton in Interface Builder, and connect the action to this function.
- (IBAction)getCurrentPlace:(UIButton *)sender {
[_placesClient currentPlaceWithCallback:^(GMSPlaceLikelihoodList *placeLikelihoodList, NSError *error){
if (error != nil) {
NSLog(@"Pick Place error %@", [error localizedDescription]);
return;
}
self.nameLabel.text = @"No current place";
self.addressLabel.text = @"";
if (placeLikelihoodList != nil) {
GMSPlace *place = [[[placeLikelihoodList likelihoods] firstObject] place];
if (place != nil) {
self.nameLabel.text = place.name;
self.addressLabel.text = [[place.formattedAddress componentsSeparatedByString:@", "]
componentsJoinedByString:@"\n"];
}
}
}];
}
@end
Adicionar um seletor de local
Os aplicativos de demonstração do SDK fornecidos com a Google Places API for iOS contêm um exemplo de aplicativo para o widget de IU do seletor de local. Para instalar a demonstração do seletor de local, use o comando pod try GooglePlacePicker. Para saber mais, consulte o guia de exemplos de código.
Veja aqui um rápido exemplo explicativo para criar um seletor de local.
Swift
import UIKit
import GooglePlacePicker
class ViewController: UIViewController {
// Add a pair of UILabels in Interface Builder, and connect the outlets to these variables.
@IBOutlet var nameLabel: UILabel!
@IBOutlet var addressLabel: UILabel!
// Add a UIButton in Interface Builder, and connect the action to this function.
@IBAction func pickPlace(_ sender: UIButton) {
let center = CLLocationCoordinate2D(latitude: 37.788204, longitude: -122.411937)
let northEast = CLLocationCoordinate2D(latitude: center.latitude + 0.001, longitude: center.longitude + 0.001)
let southWest = CLLocationCoordinate2D(latitude: center.latitude - 0.001, longitude: center.longitude - 0.001)
let viewport = GMSCoordinateBounds(coordinate: northEast, coordinate: southWest)
let config = GMSPlacePickerConfig(viewport: viewport)
let placePicker = GMSPlacePicker(config: config)
placePicker.pickPlace(callback: {(place, error) -> Void in
if let error = error {
print("Pick Place error: \(error.localizedDescription)")
return
}
if let place = place {
self.nameLabel.text = place.name
self.addressLabel.text = place.formattedAddress?.components(separatedBy: ", ")
.joined(separator: "\n")
} else {
self.nameLabel.text = "No place selected"
self.addressLabel.text = ""
}
})
}
}
Objective-C
#import "ViewController.h"
@import GooglePlacePicker;
@interface ViewController ()
// 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 ViewController {
GMSPlacePicker *_placePicker;
}
// Add a UIButton in Interface Builder, and connect the action to this function.
- (IBAction)pickPlace:(UIButton *)sender {
CLLocationCoordinate2D center = CLLocationCoordinate2DMake(37.788204, -122.411937);
CLLocationCoordinate2D northEast = CLLocationCoordinate2DMake(center.latitude + 0.001,
center.longitude + 0.001);
CLLocationCoordinate2D southWest = CLLocationCoordinate2DMake(center.latitude - 0.001,
center.longitude - 0.001);
GMSCoordinateBounds *viewport = [[GMSCoordinateBounds alloc] initWithCoordinate:northEast
coordinate:southWest];
GMSPlacePickerConfig *config = [[GMSPlacePickerConfig alloc] initWithViewport:viewport];
_placePicker = [[GMSPlacePicker alloc] initWithConfig:config];
[_placePicker pickPlaceWithCallback:^(GMSPlace *place, NSError *error) {
if (error != nil) {
NSLog(@"Pick Place error %@", [error localizedDescription]);
return;
}
if (place != nil) {
self.nameLabel.text = place.name;
self.addressLabel.text = [[place.formattedAddress
componentsSeparatedByString:@", "] componentsJoinedByString:@"\n"];
} else {
self.nameLabel.text = @"No place selected";
self.addressLabel.text = @"";
}
}];
}
@end