Cómo detectar eventos de navegación

Usa esta guía para permitir que tu app escuche y responda a una variedad de eventos que cambian a medida que un usuario navega por una ruta. Esta guía no abarca la definición de una ruta, solo la respuesta a eventos a lo largo de una ruta.

Descripción general

El SDK de Navigation para iOS te proporciona objetos de escucha asociados con la ubicación del usuario y las condiciones a lo largo de la ruta, así como datos importantes de tiempo y distancia. En el controlador de vista del mapa, tu app debe adoptar los protocolos para estos objetos de escucha: GMSRoadSnappedLocationProviderListener y GMSNavigatorListener.

En esta lista, se muestran los métodos de escucha disponibles para eventos de navegación:

Consulta el código

Cómo declarar la conformidad con los protocolos requeridos

Antes de implementar los métodos de navegación, el controlador de vista debe adoptar los protocolos:

Swift

class ViewController: UIViewController, GMSNavigatorListener,
GMSRoadSnappedLocationProviderListener {

Objective-C

@interface ViewController () <GMSNavigatorListener,
GMSRoadSnappedLocationProviderListener>

@end

Después de adoptar los protocolos de navegación, configura los objetos de escucha en el controlador de vista. Por ejemplo, puedes agregar el siguiente código al método viewDidLoad().

Swift

mapView.navigator?.add(self) mapView.roadSnappedLocationProvider?.add(self)

Objective-C

[_mapView.navigator addListener:self]; [_mapView.roadSnappedLocationProvider
addListener:self];

Cómo recibir o detener actualizaciones de ubicación

Se requieren actualizaciones de ubicación para mostrar el progreso del usuario en el mapa.

La instancia location expone las siguientes propiedades:

Propiedad de ubicación Descripción
Altitud Altitud actual
coordinate.latitude Coordenada de latitud ajustada a la ruta actual
coordinate.longitude Coordenada de longitud ajustada a la ruta actual
curso Orientación actual en grados
velocidad Velocidad actual
timestamp Fecha y hora de la lectura actual

Para recibir actualizaciones continuas de ubicación, llama a mapView.roadSnappedLocationProvider.startUpdatingLocation y usa GMSRoadSnappedLocationProviderListener para controlar el evento didUpdateLocation.

En el siguiente ejemplo, se muestra cómo llamar a startUpdatingLocation:

Swift

mapView.roadSnappedLocationProvider.startUpdatingLocation()

Objective-C

[_mapView.roadSnappedLocationProvider startUpdatingLocation];

El siguiente código crea un GMSRoadSnappedLocationProviderListener que controla el evento didUpdateLocation.

Swift

func locationProvider(_ locationProvider: GMSRoadSnappedLocationProvider,
didUpdate location: CLLocation) { print("Location: \(location.description)") }

Objective-C

-   (void)locationProvider:(GMSRoadSnappedLocationProvider *)locationProvider
    didUpdateLocation:(CLLocation *)location { NSLog(@"Location: %@",
    location.description); }

Para recibir actualizaciones de ubicación cuando la app está en segundo plano, establece allowsBackgroundLocationUpdates en true:

Swift

mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = true

Objective-C

 _mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = YES;

Cómo detectar eventos de llegada

Tu app usa el evento didArriveAtWaypoint para detectar cuándo se llegó a un destino. Puedes reanudar la guía y avanzar al siguiente punto de ruta llamando a continueToNextDestination() y, luego, volver a habilitar la guía. Tu app debe volver a habilitar la guía después de llamar a continueToNextDestination().

Después de que la app llama a continueToNextDestination, el navegador ya no tiene datos sobre el destino anterior. Si deseas analizar información sobre un tramo de la ruta, debes recuperarla del navegador antes de llamar a continueToNextDestination().

En el siguiente ejemplo de código, se muestra un método para controlar el evento didArriveAtWaypoint:

Swift

func navigator(_ navigator: GMSNavigator, didArriveAt waypoint:
GMSNavigationWaypoint) { print("You have arrived at: \(waypoint.title)")
mapView.navigator?.continueToNextDestination()
mapView.navigator?.isGuidanceActive = true }

Objective-C

-   (void)navigator:(GMSNavigator *)navigator
    didArriveAtWaypoint:(GMSNavigationWaypoint *)waypoint { NSLog(@"You have
    arrived at: %@", waypoint.title); [_mapView.navigator
    continueToNextDestination]; _mapView.navigator.guidanceActive = YES; }

Cómo recibir actualizaciones de cambio de ruta

Para recibir una notificación cada vez que se cambie la ruta, crea un método para controlar el evento navigatorDidChangeRoute. Puedes acceder a la ruta nueva con las propiedades routeLegs y currentRouteLeg de GMSNavigator.

Swift

func navigatorDidChangeRoute(_ navigator: GMSNavigator) { print("The route has
changed.") }

Objective-C

-   (void)navigatorDidChangeRoute:(GMSNavigator *)navigator { NSLog(@"The route
    has changed."); }

Cómo recibir actualizaciones de tiempo hasta el destino

Para recibir actualizaciones continuas de tiempo hasta el destino, crea un método para controlar el evento didUpdateRemainingTime. El parámetro time proporciona el tiempo estimado, en segundos, hasta que se llega al próximo destino.

Swift

func navigator(_ navigator: GMSNavigator, didUpdateRemainingTime time:
TimeInterval) { print("Time to next destination: \(time)") }

Objective-C

-   (void)navigator:(GMSNavigator *)navigator
    didUpdateRemainingTime:(NSTimeInterval)time { NSLog(@"Time to next
    destination: %f", time); }

Para establecer el cambio mínimo en el tiempo estimado hasta el próximo destino, configura la propiedad timeUpdateThreshold en GMSNavigator. El valor se especifica en segundos. Si no se establece esta propiedad, los servicios usan un valor predeterminado de un segundo.

Swift

navigator?.timeUpdateThreshold = 10

Objective-C

navigator.timeUpdateThreshold = 10;

Cómo recibir actualizaciones de distancia hasta el destino

Para recibir actualizaciones continuas de distancia hasta el destino, crea un método para controlar el evento didUpdateRemainingDistance. El parámetro distance proporciona la distancia estimada, en metros, hasta el próximo destino.

Swift

func navigator(_ navigator: GMSNavigator, didUpdateRemainingDistance distance:
CLLocationDistance) { let miles = distance * 0.00062137 print("Distance to next
destination: \(miles) miles.") }

Objective-C

-   (void)navigator:(GMSNavigator *)navigator
    didUpdateRemainingDistance:(CLLocationDistance)distance { double miles =
    distance * 0.00062137; NSLog(@"%@", [NSString stringWithFormat:@"Distance to
    next destination: %.2f.", miles]); }

Para establecer el cambio mínimo en la distancia estimada hasta el próximo destino, configura la propiedad distanceUpdateThreshold en GMSNavigator (el valor se especifica en metros). Si no se establece esta propiedad, los servicios usan un valor predeterminado de un metro.

Swift

navigator?.distanceUpdateThreshold = 100

Objective-C

navigator.distanceUpdateThreshold = 100;

Cómo recibir actualizaciones de tráfico

Para recibir actualizaciones continuas del flujo de tráfico para la ruta restante, crea un método para controlar el evento didUpdateDelayCategory. Una llamada a delayCategoryToNextDestination muestra GMSNavigationDelayCategory, que proporciona un valor de 0 a 3. Las actualizaciones de la categoría se basan en la posición actual del usuario de la app. Si los datos de tráfico no están disponibles, GMSNavigationDelayCategory muestra 0. Los números, del 1 al 3, indican un aumento del flujo de tráfico de ligero a intenso.

Swift

func navigator(_ navigator: GMSNavigator, didUpdate delayCategory:
GMSNavigationDelayCategory) { print("Traffic flow to next destination:
\(delayCategory)") }

Objective-C

-   (void)navigator:(GMSNavigator *)navigator
    didUpdateDelayCategory:(GMSNavigationDelayCategory)delayCategory {
    NSLog(@"Traffic flow to next destination: %ld", (long)delayCategory); }

La propiedad GMSNavigationDelayCategory expone los siguientes niveles de demora:

Categoría de demora Descripción
GMSNavigationDelayCategoryNoData 0: No disponible, no hay datos de tráfico ni de
la ruta.
GMSNavigationDelayCategoryHeavy 1: Intenso
GMSNavigationDelayCategoryMedium 2: Moderado
GMSNavigationDelayCategoryLight 3: Ligero

Cómo recibir actualizaciones de exceso de velocidad

Para recibir actualizaciones cuando un conductor supera el límite de velocidad, crea un método para controlar el evento didUpdateSpeedingPercentage.

Swift

// Listener to handle speeding events. func navigator( _ navigator:
GMSNavigator, didUpdateSpeedingPercentage percentageAboveLimit: CGFloat ) {
print("Speed is \(percentageAboveLimit) above the limit.") }

Objective-C

// Listener to handle speeding events. - (void)navigator:(GMSNavigator
*)navigator didUpdateSpeedingPercentage:(CGFloat)percentageAboveLimit {
NSLog(@"Speed is %f percent above the limit.", percentageAboveLimit); }

Cómo cambiar el modo de iluminación sugerido

Para recibir actualizaciones de los cambios estimados en la iluminación, crea un método para controlar el evento didChangeSuggestedLightingMode.

Swift

// Define a listener for suggested changes to lighting mode. func navigator(_
navigator: GMSNavigator, didChangeSuggestedLightingMode lightingMode:
GMSNavigationLightingMode) { print("Suggested lighting mode has changed:
\(String(describing: lightingMode))")

 // Make the suggested change. mapView.lightingMode = lightingMode }

Objective-C

// Define a listener for suggested changes to lighting mode.
-(void)navigator:(GMSNavigator *)navigator didChangeSuggestedLightingMode:
(GMSNavigationLightingMode)lightingMode { NSLog(@"Suggested lighting mode has
changed: %ld", (long)lightingMode);

 // Make the suggested change. _mapView.lightingMode = lightingMode; }