1. Antes de comenzar
Antes de comenzar a escribir código, deberás configurar algunos requisitos previos.
Xcode
En este instructivo, se usa la herramienta Xcode de Apple junto con el lenguaje Objective-C para crear una aplicación para iOS simple que se ejecuta en un emulador. No necesitas un dispositivo físico. Puedes obtener Xcode en https://developer.apple.com/xcode/
CocoaPods
El SDK de Places para iOS está disponible como un pod de CocoaPods. CocoaPods es una herramienta de administración de dependencias de código abierto para proyectos de Swift y Objective-C. Si aún no tienes esta herramienta, deberás instalarla antes de continuar. Se puede instalar desde la terminal de la siguiente manera:
sudo gem install cocoapods
Para obtener más detalles sobre CocoaPods, consulta la guía de introducción de CocoaPods.
Instalar el SDK
Para instalar el SDK, debes crear un archivo Podfile en el directorio de tu proyecto que CocoaPods usará para descargar y configurar las dependencias necesarias. La forma más fácil de hacerlo es crear un proyecto nuevo en Xcode, agregarle un Podfile y, luego, instalar los pods allí.
Abre Xcode y verás la pantalla "Welcome to Xcode". Aquí, selecciona "Create a new Xcode project".
En la siguiente pantalla, se te pedirá una plantilla para tu proyecto nuevo. Selecciona "Single View Application" para iOS y presiona "Next".
Cuando se te solicite el nombre del producto, puedes elegir el que quieras, pero asegúrate de anotar el identificador del paquete que se genera para ti. Lo necesitarás más adelante.
Presiona "Siguiente" y se creará el proyecto. Toma nota del directorio en el que se creó. Cierra Xcode y, con la terminal, navega a ese directorio.
En la terminal, ingresa el siguiente comando:
pod init
Se creará un archivo llamado Podfile. Edítalo para agregar un pod para GoogleMaps de la siguiente manera:
target '{YOUR APP NAME}' do
pod 'GoogleMaps'
end
Guárdalo y cierra Xcode. Asegúrate de cerrarlo, ya que en el siguiente paso editarás el proyecto subyacente. Abrirás un archivo de proyecto diferente cuando termines, y es bastante común que un desarrollador se confunda sobre dónde está todo si no cerró Xcode antes. Ahora, en una terminal, ve al directorio de tu proyecto y ejecuta "pod install" de la siguiente manera:
Cuando termines, se instalarán los Pods y se creará un nuevo archivo .xcworkspace. Úsalo para el proyecto de ahora en adelante. Sin embargo, antes de codificar, lo siguiente que necesitarás es una clave de API.
2. Obtén tu clave de API
Para el siguiente paso, debes habilitar el SDK de Maps para iOS.
Configura Google Maps Platform
Si todavía no tienes una cuenta de Google Cloud Platform y un proyecto con la facturación habilitada, consulta la guía Cómo comenzar a utilizar Google Maps Platform para crear una cuenta de facturación y un proyecto.
- En Cloud Console, haz clic en el menú desplegable del proyecto y selecciona el proyecto que deseas usar para este codelab.
- Habilita las API y los SDK de Google Maps Platform necesarios para este codelab en Google Cloud Marketplace. Para hacerlo, sigue los pasos que se indican en este video o esta documentación.
- Genera una clave de API en la página Credenciales de Cloud Console. Puedes seguir los pasos que se indican en este video o esta documentación. Todas las solicitudes a Google Maps Platform requieren una clave de API.
3. Cómo crear la app de la API de Places
Ahora que creaste un proyecto de consola y activaste la API de Places en él, obtuviste una clave de API y tienes todo listo para comenzar a programar tu primera app de la API de Places.
Cuando instalaste los archivos de Pod antes, se creó un nuevo archivo .xcworkspace. Para abrirlo, haz doble clic en él.
En el Explorador de proyectos, verás que ahora tienes una carpeta nueva llamada “Pods”. Si esto funcionó correctamente, verás una carpeta de GoogleMaps que contiene los frameworks.
4. Edita el archivo Info.plist.
Cuando ejecutes la aplicación por primera vez, iOS te mostrará un diálogo en el que se le pedirá al usuario que otorgue permiso para acceder a los servicios de ubicación. Este diálogo proporcionará una cadena que definas y que colocarás en el archivo Info.plist. Si esta cadena no está presente, no se mostrará el diálogo y la app no funcionará.
Puedes encontrar el archivo Info.plist en el explorador del proyecto aquí:
Selecciónalo y verás el editor de plist.
Coloca el cursor sobre cualquiera de los elementos y verás que aparece un ícono de “+”. Presiónala y verás que aparece una entrada nueva. Ingresa el valor "NSLocationAlwaysUsageDescription" en este cuadro.
Presiona Intro para agregar la clave nueva. Luego, haz doble clic en la columna Value de esta clave y agrega una cadena:
Para obtener más información sobre esta cadena, consulta la documentación para desarrolladores de Apple aquí.
5. Edita el delegado de tu app
En el explorador de proyectos, busca y abre AppDelegate.m. Lo usarás para agregar tu clave de API.
En la parte superior del archivo, agrega lo siguiente inmediatamente debajo de la línea #import:
@import GoogleMaps;
Luego, en la función didFinishLaunchingWithOptions:, agrega lo siguiente justo antes de la línea “return YES”:
[GMSServices provideAPIKey:@"<Add your API Key>"];
Asegúrate de usar la clave de API que generaste antes.
6. Cómo editar el archivo de guion gráfico
En el explorador del proyecto, abre el archivo Main.storyboard. Asegúrate de que la barra lateral esté activa. Para ello, presiona el botón de la barra lateral en la esquina superior derecha.
Luego, en la parte inferior de la barra lateral, busca el control de etiqueta. Para ello, asegúrate de que la biblioteca de objetos esté seleccionada.
En la escena del controlador de vistas que se encuentra en el lado izquierdo, asegúrate de que esté seleccionada la opción “View”:
Luego, arrastra y suelta 7 etiquetas en la vista. Colócalos como se muestra aquí. Asegúrate de arrastrar los tamaños para que coincidan con lo que se muestra. Para editar el texto de la etiqueta, haz doble clic en ella y escribe el valor requerido:
En el caso de la etiqueta inferior (la más grande), ve al editor de propiedades y asegúrate de que esté configurada para tener 0 líneas (el valor predeterminado es 1). Esto permitirá que se rendericen varias líneas.
7. Crea salidas para los valores
Para las 3 etiquetas de "valor", deberás crear un punto de venta. Esto te permitirá cambiar sus valores con código. Para ello, primero deberás activar el editor de asistente. Para ello, primero cierra la barra lateral de propiedades haciendo clic en su botón para quitarla. (Este botón se mostró en el paso anterior).
Luego, selecciona el botón del asistente, que es el de doble círculo que se muestra aquí:
Asegúrate de que se renderice el archivo ViewController.h. Si no es así, puedes cambiarlo con el editor que se encuentra en la parte superior de la ventana del asistente:
Luego, mientras mantienes presionada la tecla CONTROL, arrastra cada etiqueta y suéltala debajo de la línea @interface en el archivo ViewController.h del asistente. Aparecerá un diálogo en el que se te preguntará qué tipo de conexión quieres establecer:
Asegúrate de que los parámetros de configuración sean como se muestran (Connection: Outlet; Type: UILabel; Storage: Weak) y, luego, asígnale un nombre a cada uno. A los fines de este codelab, llamé a las etiquetas de longitud, latitud y altitud lblLongitude, lblLatitude y lblAltidude, respectivamente. También arrastra la etiqueta grande desde la parte inferior y llámala lblPlaces.
Cuando termines, tu archivo ViewController.h debería verse así:
#import <UIKit/UIKit.h>
@import GoogleMaps;
@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *lblLatitude;
@property (weak, nonatomic) IBOutlet UILabel *lblLongitude;
@property (weak, nonatomic) IBOutlet UILabel *lblAltitude;
@property (weak, nonatomic) IBOutlet UILabel *lblPlaces;
@end
8. Edita el archivo de encabezado para las APIs de ubicación y de cliente de Google
Antes de los pasos finales, en los que compilas la app para usar la API de Places, debes configurar algunas variables más en el archivo de encabezado (ViewController.h). Estos son el administrador de Core Location y un objeto de Core Location:
@property (strong, nonatomic) CLLocationManager *locationManager;
@property (strong, nonatomic) CLLocation *location;
También necesitarás un cliente de la API de Google:
@property GMSPlacesClient *placesClient;
Por último, deberás actualizar el archivo de encabezado para que la clase implemente CLLocationManagerDelegate:
@interface ViewController : UIViewController<CLLocationManagerDelegate>
Cuando termines, tu archivo de encabezado debería verse así:
#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>
#import <GoogleMaps/GoogleMaps.h>
@interface ViewController : UIViewController<CLLocationManagerDelegate>
@property (strong, nonatomic) CLLocationManager *locationManager;
@property (strong, nonatomic) CLLocation *location;
@property (weak, nonatomic) IBOutlet UILabel *lblLongitude;
@property (weak, nonatomic) IBOutlet UILabel *lblLatitude;
@property (weak, nonatomic) IBOutlet UILabel *lblAltitude;
@property (weak, nonatomic) IBOutlet UILabel *lblPlaces;
@property GMSPlacesClient *placesClient;
@end
9. Edita tu controlador de vistas
El primer paso es editar la función viewDidLoad para inicializar el administrador de ubicación, solicitar la autorización del usuario para acceder a la ubicación y, por último, iniciar el administrador de ubicación para que haga un seguimiento de la ubicación actual. También inicializarás el cliente de la API de Google Places.
- (void)viewDidLoad {
[super viewDidLoad];
self.locationManager = [[CLLocationManager alloc]init];
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
if([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
[self.locationManager requestAlwaysAuthorization];
// Or [self.locationManager requestWhenInUseAuthorization];
}
[self.locationManager startUpdatingLocation];
self.locationManager.delegate = self;
self.location = [[CLLocation alloc] init];
self.placesClient = [GMSPlacesClient sharedClient];
}
10. Cómo controlar las actualizaciones de ubicación
El administrador de ubicaciones llamará a tu controlador de vistas con actualizaciones de ubicación llamando a la función didUpdateLocations. Deberás agregar esto a tu ViewController.m. La función se ve de la siguiente manera:
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
// Enter code here
}
Esta función deberá realizar varias acciones.
Primero, almacenará en caché la ubicación con la última recibida:
self.location = locations.lastObject;
A continuación, se deben actualizar las tres etiquetas de latitud, longitud y altitud:
self.lblLatitude.text = [NSString stringWithFormat:@"%f", self.location.coordinate.latitude];
self.lblLongitude.text = [NSString stringWithFormat:@"%f", self.location.coordinate.longitude];
self.lblAltitude.text = [NSString stringWithFormat:@"%f", self.location.altitude];
A continuación, llamarás a la API de Places con el cliente de Places. Para ello, debes especificar la función de devolución de llamada, que obtendrá la lista de verosimilitudes de lugares. La API de Places determina la probabilidad de que te encuentres en un lugar determinado según tu ubicación. Devuelve el nombre de los lugares probables, junto con un valor entre 0 y 1 que contiene la probabilidad de que te encuentres en ese lugar.
[self.placesClient currentPlaceWithCallback:^(GMSPlaceLikelihoodList *likelihoodList, NSError *error) {
Luego, puedes implementar la devolución de llamada. Esto iterará a través de la lista de probabilidades y agregará lugares y probabilidades para esos lugares.
[self.placesClient currentPlaceWithCallback:^(GMSPlaceLikelihoodList *likelihoodList, NSError *error) {
if (error != nil) {
NSLog(@"Current Place error %@", [error localizedDescription]);
return;
}
NSMutableString *strPlaces = [NSMutableString stringWithString:@""];
for (GMSPlaceLikelihood *likelihood in likelihoodList.likelihoods) {
GMSPlace* place = likelihood.place;
NSLog(@"Current Place name %@ at likelihood %g", place.name,
likelihood.likelihood);
NSLog(@"Current Place address %@", place.formattedAddress);
NSLog(@"Current Place attributions %@", place.attributions);
NSLog(@"Current PlaceID %@", place.placeID);
[strPlaces appendString:place.name];
[strPlaces appendString:@" "];
[strPlaces appendFormat:@"%g",likelihood.likelihood];
[strPlaces appendString:@"\n"];
}
self.lblPlaces.text = strPlaces;
}];
Cuando termines, tu función didUpdateLocations debería verse así:
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
self.location = locations.lastObject;
self.lblLatitude.text = [NSString stringWithFormat:@"%f", self.location.coordinate.latitude];
self.lblLongitude.text = [NSString stringWithFormat:@"%f", self.location.coordinate.longitude];
self.lblAltitude.text = [NSString stringWithFormat:@"%f", self.location.altitude];
NSLog(@"%@", self.location.description);
[self.placesClient currentPlaceWithCallback:^(GMSPlaceLikelihoodList *likelihoodList, NSError *error) {
if (error != nil) {
NSLog(@"Current Place error %@", [error localizedDescription]);
return;
}
NSMutableString *strPlaces = [NSMutableString stringWithString:@""];
for (GMSPlaceLikelihood *likelihood in likelihoodList.likelihoods)
{
GMSPlace* place = likelihood.place;
NSLog(@"Current Place name %@ at likelihood %g", place.name, likelihood.likelihood);
NSLog(@"Current Place address %@", place.formattedAddress);
NSLog(@"Current Place attributions %@", place.attributions);
NSLog(@"Current PlaceID %@", place.placeID);
[strPlaces appendString:place.name];
[strPlaces appendString:@" "];
[strPlaces appendFormat:@"%g",likelihood.likelihood];
[strPlaces appendString:@"\n"];
}
self.lblPlaces.text = strPlaces;
}];
}
Ya puedes ejecutar tu app y probarla.
11. Cómo ejecutar la app en el emulador
Ejecuta la app con el botón de ejecución de la barra de título. Esto también te permite seleccionar el tipo de ejecución y, como puedes ver aquí, estoy probando en un iPhone 6 con el emulador.
Cuando presiones el botón de ejecución, la app se compilará y se iniciará. Verás la solicitud para permitir que la app acceda a la ubicación, incluida la cadena personalizada que especificaste antes.
Una vez que lo hagas, verás que se actualizan tu latitud y longitud. Para cambiar la ubicación, selecciona el menú Depurar y elige una ubicación. Por ejemplo, puedes elegir "Conducción por autopista".
Cuando lo hagas, verás la ubicación con sus lugares probables actualizándose, lo que simulará el viaje por la autopista.
Eso es todo. Accediste correctamente a los detalles del lugar actual con la API de Google Places en iOS.