Detectar eventos de navegação

Use este guia para ativar seu app para detectar e responder a vários eventos que mudam à medida que um usuário navega por um trajeto. Este guia não aborda a definição de um trajeto, apenas a resposta a eventos ao longo de um trajeto.

Visão geral

O SDK Navigation para iOS oferece listeners associados à localização do usuário e às condições ao longo do trajeto, além de dados importantes de tempo e distância. No controlador de visualização do mapa, seu app precisa adotar os protocolos desses listeners: GMSRoadSnappedLocationProviderListener e GMSNavigatorListener.

Esta lista mostra os métodos de listener disponíveis para eventos de navegação:

Achou o código?

Como declarar conformidade com os protocolos necessários

Antes de implementar os métodos de navegação, o controlador de visualização precisa adotar os protocolos:

Swift

class ViewController:
  UIViewController,
  GMSNavigatorListener,
  GMSRoadSnappedLocationProviderListener
{
}

Objective-C

@interface ViewController () <GMSNavigatorListener, GMSRoadSnappedLocationProviderListener>
@end

Depois de adotar os protocolos de navegação, defina os listeners para o controlador de visualização. Por exemplo, você pode adicionar o código a seguir ao método viewDidLoad().

Swift

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

Objective-C

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

Como receber ou interromper atualizações de localização

As atualizações de localização são necessárias para mostrar o progresso do usuário no mapa.

A instância location expõe as seguintes propriedades:

Propriedade de localização Descrição
altitude Altitude atual.
coordinate.latitude Coordenada de latitude atual.
coordinate.longitude Coordenada de longitude atual.
course Rolamento atual em graus.
speed Velocidade atual.
timestamp Data/hora da leitura atual.

Para receber atualizações contínuas de localização, chame mapView.roadSnappedLocationProvider.startUpdatingLocation e use GMSRoadSnappedLocationProviderListener para processar o evento didUpdateLocation.

O exemplo a seguir mostra como chamar startUpdatingLocation:

Swift

mapView.roadSnappedLocationProvider.startUpdatingLocation()

Objective-C

[_mapView.roadSnappedLocationProvider startUpdatingLocation];

O código a seguir cria um GMSRoadSnappedLocationProviderListener que processa o 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 receber atualizações de localização quando o app estiver em segundo plano, defina allowsBackgroundLocationUpdates como verdadeiro:

Swift

mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = true

Objective-C

 _mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = YES;

Como detectar eventos de chegada

Seu app usa o evento didArriveAtWaypoint para detectar quando um destino foi alcançado. Você pode retomar a orientação e avançar para o próximo waypoint chamando continueToNextDestinationWithCompletion() e reativando a orientação. Seu app precisa reativar a orientação depois de chamar continueToNextDestinationWithCompletion().

Depois que o app chama continueToNextDestinationWithCompletion, o navegador não tem mais dados sobre o destino anterior. Se você quiser analisar informações sobre um trecho da rota, recupere essas informações do navegador antes de chamar continueToNextDestinationWithCompletion().

O exemplo de código a seguir mostra um método para processar o evento didArriveAtWaypoint:

Swift

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

Objective-C

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

Como receber atualizações de mudança de trajeto

Para receber uma notificação sempre que o trajeto for alterado, crie um método para processar o evento navigatorDidChangeRoute. Você pode acessar o novo trajeto usando as propriedades routeLegs e currentRouteLeg de GMSNavigator.

Swift

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

Objective-C

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

Como receber atualizações de tempo até o destino

Para receber atualizações contínuas de tempo até o destino, crie um método para processar o evento didUpdateRemainingTime. O parâmetro time fornece o tempo estimado, em segundos, até que o próximo destino seja alcançado.

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 definir a mudança mínima no tempo estimado até o próximo destino, defina a propriedade timeUpdateThreshold em GMSNavigator. O valor é especificado em segundos. Se essa propriedade não estiver definida, os serviços vão usar um valor padrão de um segundo.

Swift

navigator?.timeUpdateThreshold = 10

Objective-C

navigator.timeUpdateThreshold = 10;

Como receber atualizações de distância até o destino

Para receber atualizações contínuas de distância até o destino, crie um método para processar o evento didUpdateRemainingDistance. O parâmetro distance fornece a distância estimada, em metros, até o 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 definir a mudança mínima na distância estimada até o próximo destino, defina a propriedade distanceUpdateThreshold em GMSNavigator (o valor é especificado em metros). Se essa propriedade não estiver definida, os serviços vão usar um valor padrão de um metro.

Swift

navigator?.distanceUpdateThreshold = 100

Objective-C

navigator.distanceUpdateThreshold = 100;

Como receber atualizações de trânsito

Para receber atualizações contínuas do fluxo de trânsito para o trajeto restante, crie um método para processar o evento didUpdateDelayCategory. Uma chamada para delayCategoryToNextDestination retorna GMSNavigationDelayCategory, que fornece um valor de 0 a 3. As atualizações da categoria são baseadas na posição atual do usuário do app. Se as informações de trânsito não estiverem disponíveis, GMSNavigationDelayCategory vai retornar 0. Os números de 1 a 3 indicam um fluxo crescente de leve 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);
}

A propriedade GMSNavigationDelayCategory expõe os seguintes níveis de atraso:

Categoria de atraso Descrição
GMSNavigationDelayCategoryNoData 0 - Indisponível, sem dados de trânsito ou :
o trajeto.
GMSNavigationDelayCategoryHeavy 1 - Intenso.
GMSNavigationDelayCategoryMedium 2 - Médio.
GMSNavigationDelayCategoryLight 3 - Iluminação.

Como receber atualizações de excesso de velocidade

Para receber atualizações quando um motorista estiver excedendo o limite de velocidade, crie um método para processar o 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);
}

Como mudar o modo de iluminação sugerido

Para receber atualizações de mudanças estimadas na iluminação, crie um método para processar o 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;
}