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 definir una ruta y responder únicamente a los eventos de una ruta.
Descripción general
El SDK de Navigation para iOS te proporciona objetos de escucha
asociada con la ubicación del usuario y las condiciones a lo largo de la ruta, y
datos importantes de tiempo y distancia. En el controlador de vistas del mapa, tu app
necesita adoptar los protocolos para estos objetos de escucha:
GMSRoadSnappedLocationProviderListener
y
GMSNavigatorListener
En esta lista, se muestran los métodos de objetos de escucha disponibles para los eventos de navegación:
GMSNavigatorListener.didArriveAtWaypoint
, se activa cuando se alcanza un destino.GMSNavigatorListener.navigatorDidChangeRoute
, que se activa cuando cambia la ruta.GMSNavigatorListener.didUpdateRemainingTime
, se llama repetidamente a medida que cambia el tiempo hasta el siguiente destino, mientras que la guía esté activa.GMSNavigatorListener.didUpdateRemainingDistance
, se llama repetidamente a medida que cambia la distancia hasta el próximo destino, mientras que la guía esté activa.GMSNavigatorListener.didUpdateDelayCategory
, se llama cuando cambia la categoría de retraso al próximo destino, mientras que la guía esté activa.GMSNavigatorListener.didChangeSuggestedLightingMode
, 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
, se activa cuando el conductor supera el límite de velocidad.GMSRoadSnappedLocationProviderListener.didUpdateLocation
, se llama repetidamente a medida que cambia la ubicación del usuario.
Consulta el código
Declara el cumplimiento de los protocolos requeridos
Antes de implementar los métodos de navegación, el controlador de vista debe adoptar las 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 la vista
responsable del tratamiento de datos. Por ejemplo, puedes agregar el siguiente código a 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 actual ajustada a la ruta. |
curso | Rumbo actual en grados. |
speed | Velocidad actual. |
timestamp | Fecha/hora de la lectura actual. |
Para recibir actualizaciones de ubicación continuas, llama
mapView.roadSnappedLocationProvider.startUpdatingLocation
y usa el
GMSRoadSnappedLocationProviderListener
para procesar didUpdateLocation
evento.
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
como verdadero:
Swift
mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = true
Objective-C
_mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = YES;
Detecta eventos de llegada
Tu app usa el evento didArriveAtWaypoint
para detectar cuándo un destino
que los usuarios alcanzaron sus objetivos. Puedes reanudar la orientación y avanzar al siguiente punto de referencia si
Llama a continueToNextDestination()
y, luego, vuelve a habilitar la orientación. Tu app
Debes volver a habilitar la orientación después de llamar a continueToNextDestination()
.
Después de que la app llama a continueToNextDestination
, el navegador ya no tiene
datos del destino anterior. Si quieres analizar información sobre un
etapa de la ruta, debes recuperarla del navegador antes de llamar
continueToNextDestination()
En el siguiente ejemplo de código, se muestra un método para controlar didArriveAtWaypoint
evento:
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; }
Recibe 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 mediante
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."); }
Tiempo de recepción de actualizaciones del destino
Para recibir actualizaciones continuas del tiempo hasta el destino, crea un método para administrar las
didUpdateRemainingTime
evento. El parámetro time
proporciona la estimación
tiempo, en segundos, hasta llegar 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 siguiente destino, establece la
propiedad timeUpdateThreshold
en GMSNavigator
. El valor se especifica en
segundos. Si no se establece esta propiedad, los servicios usan un valor predeterminado de uno
por segundo.
Swift
navigator?.timeUpdateThreshold = 10
Objective-C
navigator.timeUpdateThreshold = 10;
Actualizaciones de la distancia de recepción al destino
Para recibir actualizaciones continuas de distancia al destino, crea un método para controlar
el evento didUpdateRemainingDistance
. El parámetro distance
proporciona la
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 uno
metro.
Swift
navigator?.distanceUpdateThreshold = 100
Objective-C
navigator.distanceUpdateThreshold = 100;
Recibe actualizaciones de tráfico
Para recibir actualizaciones continuas del flujo de tráfico de la ruta restante,
Crea un método para controlar el evento didUpdateDelayCategory
. Llamada a
delayCategoryToNextDestination
muestra GMSNavigationDelayCategory
, que
proporciona un valor de 0 a 3. Las actualizaciones de la categoría se basan en la
del usuario de la aplicación. Si los datos de tráfico no están disponibles,
GMSNavigationDelayCategory
muestra 0. Los números del 1 al 3 indican un aumento
fluir de leve a intensa.
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 retraso | Descripción |
---|---|
GMSNavigationDelayCategoryNoData | 0 - No disponible, sin datos de tráfico o : |
la ruta. | |
GMSNavigationDelayCategoryHeavy | 1) Intensas. |
GMSNavigationDelayCategoryMedium | 2) Media. |
GMSNavigationDelayCategoryLight | 3) Luz. |
Recibiendo actualizaciones de velocidad
Crea un método para recibir actualizaciones cuando un conductor supere el límite de velocidad.
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); }
Cambiando el modo de iluminación sugerida
Para recibir actualizaciones sobre cambios estimados en la iluminación, crea un método de control
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; }