Detectar eventos de navegação

Use este guia para permitir que o app detecte e responda a vários eventos que mudam conforme o usuário navega ao longo de um trajeto. Neste guia, não vamos abordar a definição de um trajeto, apenas responder aos eventos ao longo dele.

Visão geral

O SDK do Navigation para iOS oferece listeners associados à localização do usuário e às condições 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 esses listeners: GMSRoadSnappedLocationProviderListener e GMSNavigatorListener.

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

Confira o código

Declarar a conformidade com os protocolos obrigatórios

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

Swift

classe ViewController: UIViewController, GMSNavigatorListener, GMSRoadSnappedLocationProviderListener {

Objective-C

@interface ViewController () <gmsroadlistener, gmsroadsnappedlocationproviderlistener=""></gmsnavigatorlistener,>

@end

Depois de adotar os protocolos de navegação, defina os listeners para o controlador de visualização. Por exemplo, você pode 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 local

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 capturada pela estrada.
coordinate.longitude Coordenada de longitude atual capturada pela estrada.
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 startReportingLocation];

O código a seguir cria um GMSRoadSnappedLocationProviderListener que processa o evento didUpdateLocation.

Swift

função 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.allowedBackgroundLocationUpdates = true

Objective-C

_mapView.roadSnappedLocationProvider.allowedBackgroundLocationUpdates = YES;

Como detectar 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 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, recupere-os do navegador antes de chamar continueToNextDestination().

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

Swift

função Navigator(_ navigator: GMSNavigator, didReachAt waypoint: GMSNavigationWaypoint) { print("Você chegou em: (waypoint.title)") mapView.navigator?.continueToNextDestination() mapView.navigator?.isGuidanceActive = true }

Objective-C

  • (void)navigator:(GMSNavigator *)Navigator didReachAtWaypoint:(GMSNavigationWaypoint *)waypoint { NSLog(@"Você chegou em: %@", waypoint.title); [_mapView.navigator continueToNextDestination]; _mapView.navigator.guidanceActive = YES; }

Como receber atualizações de mudanças de rota

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

função NavigatorInstruçõesChangeRoute(_ Navigator: GMSNavigator) { print("A rota foi alterada.") }

Objective-C

  • (void)navigatorPerformChangeRoute:(GMSNavigator *)navigator { NSLog(@"A rota foi alterada."); }

Recebendo atualizações do horário até o destino

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

Swift

função navigator(_ Navigator: GMSNavigator, didUpdateRestrictedTime time: TimeInterval) { print("Tempo até o próximo destino: (time)") }

Objective-C

  • (void)navigator:(GMSNavigator *)Navigator didUpdateStayTime:(NSTimeInterval)time { NSLog(@"Tempo até o próximo destino: %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 essa 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;

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, didUpdateSupportedDistancedistance: CLLocationDistance) { let Miles = distance * 0.00062137 print("Distância até o próximo destino: (milhas) milhas.") }

Objective-C

  • (void)navigator:(GMSNavigator *)navigator didUpdateAssistantDistance:(CLLocationDistance)distance { double milhas = distance * 0.00062137; NSLog(@"%@", [NSString stringWithFormat:@"Distância até o próximo destino: %.2f.", milhas]); }

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

Swift

função Navigator(_ Navigator: GMSNavigator, didUpdate delayCategory: GMSNavigationDelayCategory) { print("Fluxo de tráfego para o próximo destino: (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 - Leve.

Recebendo 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 para processar eventos de velocidade. função navigator( _ Navigator: GMSNavigator, didUpdateSpeedingPercentage percentageAboveLimit: CGFloat ) { print("A velocidade está (percentageAboveLimit) acima do limite.") }

Objective-C

// Listener para processar eventos de velocidade. - (void)navigator:(GMSNavigator *)navigator didUpdateSpeedingPercentage:(CGFloat)percentageAboveLimit { NSLog(@"A velocidade está %f por cento acima do limite.", percentageAboveLimit); }

Mudando o modo de iluminação sugerida

Para receber atualizações sobre mudanças estimadas na iluminação, crie um método para processar o evento didChangeSuggestedLightingMode.

Swift

// Defina um listener para mudanças sugeridas no modo de iluminação. função navigator(_ navigator: GMSNavigator, didChangeSuggestedLightingMode Lighthouse: GMSNavigationLightingMode) { print("Suggested light mode has changed: (String(describing: lightsMode))")

// Faça a alteração sugerida. mapView.lightingMode = iluminaçãoMode }

Objective-C

// Defina um listener para as mudanças sugeridas no modo de iluminação. -(void)Navigator:(GMSNavigator *)navigator didChangeSuggestedLightingMode: (GMSNavigationLightingMode)lightingMode { NSLog(@"Suggested Light mode", mudou: %ld", (long)lightingMode);

// Faça a alteração sugerida. _mapView.lightingMode = iluminaçãoMode; }