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. En esta guía, no se abarca la definición de una ruta, sino solo cómo responder a los eventos 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 vistas 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 objeto de escucha disponibles para los eventos de navegación:
GMSNavigatorListener.didArriveAtWaypoint
, que se activa cuando se alcanza un destinoGMSNavigatorListener.navigatorDidChangeRoute
, que se activa cuando cambia la rutaGMSNavigatorListener.didUpdateRemainingTime
, que se llama repetidamente cuando cambia la hora del siguiente destino, mientras la guía está activa.GMSNavigatorListener.didUpdateRemainingDistance
, que se llama repetidamente a medida que cambia la distancia al siguiente destino, mientras la guía está activaGMSNavigatorListener.didUpdateDelayCategory
, que se llama cuando cambia la categoría de retraso al siguiente destino mientras la guía está activa.GMSNavigatorListener.didChangeSuggestedLightingMode
, que se activa cuando se actualizan las condiciones de iluminación estimadas Por ejemplo, cuando cae la noche en la ubicación actual del usuario, cambia la iluminación.GMSNavigatorListener.didUpdateSpeedingPercentage
, que se activa cuando el conductor supera el límite de velocidadGMSRoadSnappedLocationProviderListener.didUpdateLocation
, que se llama repetidamente cuando cambia la ubicación del usuario.
Consulta el código
Declaración de conformidad con los protocolos requeridos
Antes de implementar los métodos de navegación, el controlador de vista debe adoptar los siguientes protocolos:
Swift
clase ViewController: UIViewController, GMSNavigatorListener, GMSRoadSnappedLocationProviderListener {
Objective‑C
@interface ViewController () <gmsnavigatorlistener, gmsroadSnappedlocationproviderlistener=""></gmsnavigatorlistener,>
@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
Las actualizaciones de ubicación son necesarias 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 actual ajustada a la ruta |
coordinate.longitude | Coordenada de longitud ajustada a la ruta actual. |
curso | Orientación actual en grados. |
speed | Velocidad actual. |
timestamp | Es la fecha y hora de la medición actual. |
Para recibir actualizaciones de ubicación continuas, 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 startrseLocation].
Con el siguiente código, se 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, configura allowsBackgroundLocationUpdates
como verdadero:
Swift
mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = verdadero
Objective‑C
_mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = YES;
Detecta eventos de llegada
Tu app usa el evento didArriveAtWaypoint
para detectar cuándo se llega a un destino. Para reanudar la guía y avanzar al siguiente punto de referencia, llama a continueToNextDestination()
y, luego, vuelve 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 segmento 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, didLlegarAt{/7} punto de referencia: GMSNavigationWaypoint) { print("Has llegado a: (waypoint.title)") mapView.navigator?.continueToNextDestination() mapView.navigator?.isGuidanceActive = true }
Objective‑C
- (void)navigator:(GMSNavigator *)navigator didReachAtWaypoint:(GMSNavigationWaypoint *)waypoint { NSLog(@"You have llarded at: %@", waypoint.title); [_mapView.navigator continueToNextDestination]; _mapView.navigator.guidanceActive = YES; }
Cómo recibir actualizaciones de cambios 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("La ruta ha cambiado.") }
Objective‑C
- (void)navigatordidChangeRoute:(GMSNavigator *)navigator { NSLog(@"La ruta ha cambiado."); }
Cómo recibir actualizaciones de tiempo de destino
Si deseas recibir actualizaciones de tiempo continuo para el destino, crea un método para controlar el evento didUpdateRemainingTime
. El parámetro time
proporciona el tiempo estimado, en segundos, hasta que se alcance el 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 al siguiente destino, configura la propiedad timeUpdateThreshold
en GMSNavigator
. El valor se especifica en segundos. Si no se configura esta propiedad, los servicios usarán un valor predeterminado de un
segundo.
Swift
navigator?.timeUpdateThreshold = 10.
Objective‑C
navigator.timeUpdateThreshold = 10;
Cómo recibir las actualizaciones de distancia hasta el destino
Para recibir actualizaciones de distancia continua al destino, crea un método para controlar el evento didUpdateRemainingDistance
. El parámetro distance
proporciona la distancia estimada, en metros, hasta el siguiente destino.
Swift
func navigator(_ navigator: GMSNavigator, didUpdateRemainingDistancedistance: CLLocationDistance) { let miles = distance * 0.00062137 print("Distancia al siguiente destino: (millas) millas.") }
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 al siguiente destino, configura la propiedad distanceUpdateThreshold
en GMSNavigator
(el valor se especifica en metros). Si no se configura esta propiedad, los servicios usarán un valor predeterminado de un
metro.
Swift
navigator?.distanceUpdateThreshold = 100
Objective‑C
navigator.distanceUpdateThreshold = 100;
Recibe actualizaciones de tráfico
Si quieres recibir actualizaciones continuas del flujo de tráfico de 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, 1-3, indican un flujo
creciente de leve a intenso.
Swift
func navigator(_ navigator: GMSNavigator, didUpdate lateCategory: GMSNavigationDelayCategory) { print("Flujo de tráfico al siguiente destino: (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 del retraso | Descripción |
---|---|
GMSNavigationDelayCategoryNoData | 0 - No disponible, sin datos de tráfico o : |
la ruta. | |
GMSNavigationDelayCategoryHeavy | 1 - Intenso. |
GMSNavigationDelayCategoryMedium | 2 - Mediano. |
GMSNavigationDelayCategoryLight | 3) Ligero. |
Recibiendo actualizaciones de límite de velocidad
Para recibir actualizaciones cuando un conductor exceda el límite de velocidad, crea un método para controlar el evento didUpdateSpeedingPercentage
.
Swift
// Objeto de escucha para controlar eventos de velocidad. func navigator( _ navigator: GMSNavigator, didUpdateSpeedingPercentage percentageAboveLimit: CGFloat ) { print("Speed is (percentageAboveLimit) over the limit.") }
Objective‑C
// Objeto de escucha para controlar eventos de aumento de velocidad. - (void)navigator:(GMSNavigator *)navigator didUpdateSpeedingPercentage:(CGFloat)percentageAboveLimit { NSLog(@"Speed is %f percentage over 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
// Definir un objeto de escucha para los cambios sugeridos en el modo de iluminación. func navigator(_ navigator: GMSNavigator, didChangeSuggestedLightingMode lightsMode: GMSNavigationLightingMode) { print("Se ha cambiado el modo de iluminación sugerido: (String(descripting: lightsMode))")
// Realiza el cambio sugerido. mapView.lightingMode = lightsMode }
Objective‑C
// Define un objeto de escucha para los cambios sugeridos en el modo de iluminación. -(void)navigator:(GMSNavigator *)navigator didChangeSuggestedLightingMode: (GMSNavigationLightingMode)lightingMode { NSLog(@"El modo de iluminación sugerido ha cambiado: %ld", (long)lightingMode);
// Realiza el cambio sugerido. _mapView.lightingMode = lightsMode; }