Detectar eventos de navegação

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

Visão geral

O SDK do Navigation para iOS oferece listeners associados ao local 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 para estes listeners: GMSRoadSnappedLocationProviderListener e GMSNavigatorListener.

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

Confira 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 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, é possível adicionar o seguinte código 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 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.
carimbo de data/hora 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 "true":

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 foi chegado. Para retomar a orientação e avançar para o próximo waypoint, chame continueToNextDestination() e reative a orientação. Seu app precisa reativar as orientações após 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, extraia essas informações no 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; }

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 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 para o próximo destino, defina a propriedade timeUpdateThreshold em GMSNavigator. O valor é especificado em segundos. Se a propriedade não for definida, o valor padrão de um segundo será usado pelos serviços.

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 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 a propriedade não for definida, o valor padrão de um medidor será usado pelos serviços.

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áfego do 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 os dados de tráfego não estiverem disponíveis, GMSNavigationDelayCategory vai retornar 0. Os números, de 1 a 3, indicam um aumento do fluxo leve para 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 mudanças estimadas de 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; }