Sigue los pasos de esta guía para descargar la Google Places API for iOS, agregar la biblioteca y sus dependencias a tu app y obtener una clave de API gratuita.
Hay disponibles notas de la versión para cada versión.
Paso 1: Descarga la última versión de Xcode
Para crear un proyecto usando la Google Places API for iOS, necesitas la versión 7.3 de Xcode o una posterior.
Paso 2: Instala la API
Usar CocoaPods
La Google Places API for iOS está disponible en dos pods de CocoaPods. El primero de estos pods, GooglePlaces, contiene la funcionalidad de todos los lugares que no exige un mapa (API de programación y el widget de IU de autocompletado), mientras que GooglePlacePicker es un pod separado que contiene un widget para buscar y seleccionar un lugar de un mapa.
CocoaPods es un administrador de dependencias de código abierto para proyectos de Swift y Objective-C de Cocoa. Si todavía no dispones de la herramienta CocoaPods, instálala en macOS ejecutando el siguiente comando desde el terminal: Para obtener información detallada, consulta la guía de primeros pasos de CocoaPods.
sudo gem install cocoapods
Crea un Podfile para la Google Places API for iOS y úsalo para instalar la API y sus dependencias:
- Si aún no tienes un proyecto de Xcode, créalo y guárdalo en tu máquina local. (Si no has realizado desarrollos de iOS antes, crea una Aplicación de vista única).
- Crea un archivo llamado
Podfileen el directorio de tu proyecto. Este archivo define las dependencias de tu proyecto. - Edita el
Podfiley agrega tus dependencias. A continuación, te mostramos un ejemplo que especifica tu nombre de destino de aplicación y los nombres de ambos pods que vienen con la Places API for iOS (GooglePlacePickeryGoogleMapssolo se exigen si usas el ejemplo del seleccionador de sitios):source 'https://github.com/CocoaPods/Specs.git' target 'YOUR_APPLICATION_TARGET_NAME_HERE' do pod 'GooglePlaces' pod 'GooglePlacePicker' pod 'GoogleMaps' end
- Guarda el
Podfile. Abre un terminal y dirígete al directorio que contiene el
Podfile:cd <path-to-project>
Ejecuta el comando
pod install. Con esto se instalarán las API especificadas en elPodfilejunto con las dependencias que contengan.pod install
Cierra Xcode y luego abre (con doble clic) el archivo
.xcworkspacede tu proyecto para ejecutar Xcode. A partir de este punto, debes usar el archivo.xcworkspacepara abrir el proyecto.
Instalación manual
En esta guía, se muestra la manera de agregar manualmente el framework de GoogleMaps a tu proyecto y configurar los ajustes de desarrollo en Xcode.
- Descarga los archivos de origen del SDK:
Solo se necesita GooglePlacePicker-2.0.1 si usas el seleccionador de sitios.
- Desempaqueta los archivos de origen.
- Ejecuta Xcode y abre un proyecto existente o crea uno nuevo. Si recién comienzas a usar iOS, crea una Aplicación de vista única, inhabilita Use Storyboards y habilita Use Automatic Reference Counting.
- Quita cualquier paquete de Maps de las versiones anteriores de tu proyecto.
- Arrastra los siguientes paquetes a tu proyecto (selecciona Copy items if needed cuando aparezca el mensaje):
GooglePlaces-2.0.1/Frameworks/GooglePlaces.frameworkGoogleMaps-2.0.1/Subspecs/Base/Frameworks/GoogleMapsBase.framework
Si estás usando el seleccionador de sitios, arrastra los siguientes paquetes a tu proyecto (además de los paquetes enumerados previamente):
GooglePlacePicker-2.0.1/Frameworks/GooglePlacePicker.frameworkGoogleMaps-2.0.1/Subspecs/Maps/Frameworks/GoogleMapsCore.frameworkGoogleMaps-2.0.1/Subspecs/Maps/Frameworks/GoogleMaps.framework
- En tu proyecto, haz clic con el botón secundario en
GooglePlaces.frameworky selecciona Show In Finder. - Arrastra
GooglePlaces.bundlede la carpetaResourcesy a tu proyecto. Cuando aparezca el mensaje, asegúrate de que la opción Copy items into destination group's folder no esté seleccionada. - Si usas el seleccionador de sitios, repite el paso previo y arrastra los archivos
GoogleMaps.bundleyGooglePlacePicker.bundlea tu proyecto. Estos se pueden encontrar enGoogleMaps.frameworkyGooglePlacePicker.frameworkrespectivamente. - Selecciona tu proyecto en el navegador de proyectos y elige el destino de la aplicación.
- Abre la pestaña Build Phases y agrega los siguientes frameworks en Link Binary with Libraries:
GooglePlaces.frameworkGoogleMapsBase.frameworkGooglePlacePicker.framework(solo si se usa el seleccionador de sitios)GoogleMapsCore.framework(solo si se usa el seleccionador de sitios)GoogleMapsCore.framework(solo si se usa el seleccionador de sitios)Accelerate.frameworkCoreData.frameworkCoreGraphics.frameworkCoreLocation.frameworkCoreText.frameworkGLKit.frameworkImageIO.frameworklibc++.tbdlibz.tbdOpenGLES.frameworkQuartzCore.frameworkSystemConfiguration.frameworkUIKit.framework
Elige tu proyecto, en lugar de un destino específico, y abre la pestaña Build Settings.
- En la sección Other Linker Flags, agrega
-ObjC. Si esta configuración no es visible, cambia el filtro de la barra Build Settings de Basic a All.
Paso 3: Obtener una clave de API
Para comenzar a usar Google Places API for iOS, haz clic en el botón que aparece a continuación, que te guiará por todo el proceso de activación de Google Places API for iOS y obtención de una clave de API.
Obtén una claveTambién puedes seguir estos pasos para obtener una clave de API:
- Ingresa a Google API Console.
- Crea o selecciona un proyecto.
- Haz clic en Continue para habilitar la Google Places API for iOS.
- En la página de Credentials, obtén una clave de API.
Nota: Si tienes una clave con restricciones de iOS, puedes usarla. Puedes usar la misma clave con cualquiera de tus aplicaciones de iOS dentro del mismo proyecto. - En el cuadro de diálogo en el que aparece la clave de API, selecciona Restrict Key para agregar una restricción de iOS a la clave de API.
- En la sección Restrictions, selecciona iOS apps y luego ingresa el identificador de paquete de tu app. Por ejemplo:
com.example.helloplaces. - Haz clic en Save.
Tu nueva clave de iOS aparece en la lista de claves de API de tu proyecto. Una clave de API es una cadena de caracteres similar a la siguiente:
AIzaSyBdVl-cTICSwYKrZ95SuvNw7dbMuDt1KG0
También puedes buscar una clave existente en Google API Console.
Para obtener más información sobre el uso de la Google API Console, consulta Ayuda de la API Console.
Paso 4: Agregar la clave de la API a tu aplicación
En los siguientes ejemplos de código se muestra la manera de agregar la clave de API a una aplicación.
Agrega tu clave de API a tu AppDelegate.swift de la siguiente manera:
- Agrega la siguiente instrucción de importación:
import GooglePlaces
- Agrega lo siguiente a tu método
application(_:didFinishLaunchingWithOptions:)y reemplaza YOUR_API_KEY por tu clave de API:GMSPlacesClient.provideAPIKey("YOUR_API_KEY")
Agrega tu clave de API a tu AppDelegate.m de la siguiente manera:
- Agrega la siguiente instrucción de importación:
@import GooglePlaces;
- Agrega lo siguiente a tu método
application:didFinishLaunchingWithOptions:, el cual reemplaza YOUR_API_KEY por tu clave de API:[GMSPlacesClient provideAPIKey:@"YOUR_API_KEY"];
Paso 5: Comienza a redactar código
En los siguientes ejemplos de código se demuestra la manera de obtener el sitio actual y agregar un widget de IU de seleccionador de sitios a tu app.
Obtener sitio actual
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
Agregar un seleccionador de sitios
En las aplicaciones de demostración de SDK proporcionadas con la Google Places API for iOS se incluye una aplicación de ejemplo para el widget de la IU del seleccionador de sitios. Para instalar la demostración del seleccionador de sitios, usa el comando pod try GooglePlacePicker. Para obtener información más detallada, consulta la guía de ejemplos de códigos.
A continuación, se ofrece un ejemplo introductorio rápido para crear un seleccionador de sitios.
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