Detectar eventos de navegação

Use este guia para permitir que seu aplicativo escute e responda a vários eventos que mudam à medida que o usuário navega ao longo de uma rota. Este guia não abrange definir uma rota, respondendo apenas a eventos ao longo dela.

Visão geral

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

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

.

Achou o código?

Declarar conformidade com os protocolos necessários

Antes de implementar os métodos de navegação, o controlador de visualização precisa adotar o 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 a visualização de controle de acesso. Por exemplo, adicione o seguinte código ao arquivo 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 do local Descrição
altitude Altitude atual.
coordinate.latitude Coordenada de latitude atual da via.
coordinate.longitude Coordenada de longitude atual capturada pela via.
curso Direção atual em graus.
velocidade Velocidade atual.
timestamp Data/hora da leitura atual.

Para receber atualizações contínuas do local, ligue mapView.roadSnappedLocationProvider.startUpdatingLocation , e use o método GMSRoadSnappedLocationProviderListener para gerenciar o didUpdateLocation. evento.

O exemplo a seguir mostra como chamar startUpdatingLocation:

Swift

mapView.roadSnappedLocationProvider.startUpdatingLocation()

Objective-C

[_mapView.roadSnappedLocationProvider startUpdatingLocation];

O código abaixo cria uma 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;

Detectando eventos de chegada

O app usa o evento didArriveAtWaypoint para detectar quando um destino foram alcançados. Você pode retomar a orientação e avançar para o próximo ponto de referência chamando continueToNextDestination() e reativando as orientações. Seu app precisa reativar a orientação depois de chamar continueToNextDestination().

Depois que o app chamar continueToNextDestination, o navegador não terá mais dados sobre o destino anterior. Se você quiser analisar informações sobre um trecho do trajeto, você deve recuperá-lo no navegador antes de chamar continueToNextDestination():

O exemplo de código a seguir mostra um método para processar o 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; }

Recebendo atualizações de mudança 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."); }

Recebendo atualizações do tempo até o destino

Para receber atualizações de tempo contínuo para o destino, crie um método para lidar com as didUpdateRemainingTime. O parâmetro time fornece o valor 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 para o próximo destino, defina o Propriedade timeUpdateThreshold em GMSNavigator. O valor é especificado em segundos. Se esta 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 da distância até o destino

Para receber atualizações de distância contínua até o destino, crie um método para processar o evento didUpdateRemainingDistance. O parâmetro distance fornece 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 alteração mínima da distância estimada até o próximo destino, defina o Propriedade distanceUpdateThreshold em GMSNavigator (o valor é especificado em metros). Se esta 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;

Recebendo atualizações de tráfego

Para receber atualizações contínuas do fluxo de trânsito no 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 posição do usuário do aplicativo. Se os dados de trânsito não estiverem disponíveis, GMSNavigationDelayCategory retorna 0. Os números, de 1 a 3, indicam aumento fluem do leve ao 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áfego ou :
ao longo do trajeto.
GMSNavigationDelayCategoryHeavy 1 - Intensa.
GMSNavigationDelayCategoryMedium 2 - Médio.
GMSNavigationDelayCategoryLight 3 - Leve.

Recebendo atualizações sobre 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); }

Como alterar o modo de iluminação sugerido

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