Detectar eventos de navegação

Use este guia para permitir que o app detecte e responda a vários eventos que mudam à medida que um usuário navega por uma rota. 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 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?

Declarar conformidade com os protocolos necessários

Antes de implementar os métodos de navegação, o view controller 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 abaixo 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 local 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 Coordenadas de latitude atuais da rua.
coordinate.longitude Coordenadas de longitude atuais da via.
curso Rumo 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 local 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. É possível retomar a orientação e avançar para o próximo ponto de passagem 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, é necessário extrair 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; }

Como receber 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."); }

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

Para receber atualizações contínuas de tempo 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 essa propriedade não for 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 for 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áfego para o restante da rota, 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 o aumento do fluxo de 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 :
a rota.
GMSNavigationDelayCategoryHeavy 1 - Pesado.
GMSNavigationDelayCategoryMedium 2 - Médio.
GMSNavigationDelayCategoryLight 3 - Luz.

Como receber atualizações de velocidade

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