Detectar eventos de navegação

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

Visão geral

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

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

Achou o código?

Declaração de 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, adicione 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];

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 local Descrição
altitude Altitude atual.
coordinate.latitude Coordenada de latitude ajustada à via atual.
coordinate.longitude Coordenada de longitude ajustada à via atual.
curso Inclinação atual em graus.
velocidade Velocidade atual.
timestamp Data/hora da leitura atual.
.

Para receber atualizações contínuas de localização, chame mapView.roadSnappedLocationProvider.startUpdatingLocation e use o 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 está em segundo plano, defina allowsBackgroundLocationUpdates como "true":

Swift

mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = true

Objective-C

 _mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = YES;

Como detectar eventos de chegada

O 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 ponto de referência chamando continueToNextDestination() e reativando a orientação. O app precisa reativar a orientação depois de chamar continueToNextDestination().

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

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?.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; }

Receber atualizações sobre mudanças de trajeto

Para receber uma notificação sempre que a rota for alterada, crie um método para processar o evento navigatorDidChangeRoute. Você pode acessar a nova rota 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."); }

Receber atualizações de tempo até o destino

Para receber atualizações contínuas do tempo até o destino, crie um método para processar o evento didUpdateRemainingTime. O parâmetro time fornece o tempo estimado, em segundos, até o 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 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 for definida, os serviços usarão um valor padrão de um segundo.

Swift

navigator?.timeUpdateThreshold = 10

Objective-C

navigator.timeUpdateThreshold = 10;

Receber atualizações sobre a distância até o destino

Para receber atualizações contínuas da 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 for definida, os serviços usarão 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áfego para o restante do trajeto, 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 os dados de tráfego 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
a rota.
GMSNavigationDelayCategoryHeavy 1 - Forte.
GMSNavigationDelayCategoryMedium 2 - Médio.
GMSNavigationDelayCategoryLight 3 – Leve.

Receber atualizações de velocidade

Para receber atualizações quando um motorista exceder 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); }

Mudar o modo de iluminação sugerido

Para receber atualizações sobre 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; }