Use este guia para permitir que seu app detecte e responda a uma variedade de eventos que mudam conforme o usuário navega por um trajeto. Este guia não aborda a definição de um trajeto, apenas a resposta a eventos ao longo de um trajeto.
Visão geral
O SDK Navigation para iOS oferece listeners
associados à localização 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ções 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:
GMSNavigatorListener.didArriveAtWaypoint, acionado quando um destino é alcançado.GMSNavigatorListener.navigatorDidChangeRoute, acionado quando o trajeto muda.GMSNavigatorListener.didUpdateRemainingTime, chamado repetidamente à medida que o tempo até o próximo destino muda, enquanto a orientação está ativa.GMSNavigatorListener.didUpdateRemainingDistance, chamado repetidamente à medida que a distância até o próximo destino muda, enquanto a orientação está ativa.GMSNavigatorListener.didUpdateDelayCategory, chamado quando a categoria de atraso para o próximo destino muda, enquanto a orientação está ativa.GMSNavigatorListener.didChangeSuggestedLightingMode, acionado quando as condições de iluminação estimadas são atualizadas. Por exemplo, quando a noite cai no local atual do usuário, a iluminação muda.GMSNavigatorListener.didUpdateSpeedingPercentage, acionado quando o motorista excede o limite de velocidade.GMSRoadSnappedLocationProviderListener.didUpdateLocation, chamado repetidamente conforme o local do usuário muda.
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, é possível adicionar 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 local
As atualizações do 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 | Coordenada de latitude atual ajustada à via. |
| coordinate.longitude | Coordenada de longitude atual ajustada à via. |
| curso | Direção atual em graus. |
| velocidade | Velocidade atual. |
| timestamp | Data/hora da leitura atual. |
Para receber atualizações contínuas de local, 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 do local quando o app estiver em segundo plano, defina
allowsBackgroundLocationUpdates como verdadeiro:
Swift
mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = true
Objective-C
_mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = YES;
Como detectar eventos de chegada
Seu app usa o evento didArriveAtWaypoint para detectar quando um destino foi
alcançado. Para retomar a orientação e avançar para o próximo ponto de referência, chame continueToNextDestinationWithCompletion() e reative
a orientação. O app precisa reativar as orientações depois de chamar
continueToNextDestinationWithCompletion().
Depois que o app chama continueToNextDestinationWithCompletion, o navegador não
tem mais dados sobre o destino anterior. Se você quiser analisar informações sobre um trecho do trajeto, recupere-as do navegador antes de chamar continueToNextDestinationWithCompletion().
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?.continueToNextDestinationWithCompletion { _, _ in }
mapView.navigator?.isGuidanceActive = true
}
Objective-C
- (void)navigator:(GMSNavigator *)navigator didArriveAtWaypoint:(GMSNavigationWaypoint *)waypoint {
NSLog(@"You have arrived at: %@", waypoint.title);
[_mapView.navigator continueToNextDestinationWithCompletion:^(GMSNavigationWaypoint *waypoint,
GMSRouteStatus status){
}];
_mapView.navigator.guidanceActive = YES;
}
Receber atualizações sobre mudanças de trajeto
Para receber uma notificação sempre que o trajeto for alterado, crie um método para
processar o evento navigatorDidChangeRoute. Para acessar o novo trajeto,
use 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 sobre o 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é 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 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 vão usar 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 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;
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ânsito não estiverem disponíveis, GMSNavigationDelayCategory vai retornar 0. Os números de 1 a 3 indicam o aumento
do fluxo, 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áfego ou : |
| da rota. | |
| GMSNavigationDelayCategoryHeavy | 1: pesado. |
| GMSNavigationDelayCategoryMedium | 2 - Médio. |
| GMSNavigationDelayCategoryLight | 3 - Leve. |
Receber atualizações sobre excesso de velocidade
Para receber atualizações quando um motorista estiver excedendo 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);
}
Mudando o modo de iluminação sugerido
GMSNavigator
calcula o modo de iluminação sugerido com base na hora do dia e na
localização do dispositivo e chama o método de listener
didChangeSuggestedLightingMode
somente quando o modo sugerido muda (como ao amanhecer ou
ao anoitecer). Para garantir que o mapa comece com o modo de iluminação adequado quando o usuário iniciar o app, defina mapView.lightingMode como suggestedLightingMode do navegador durante a inicialização e implemente didChangeSuggestedLightingMode para processar as mudanças subsequentes.
O exemplo a seguir mostra como definir o modo de iluminação inicial e detectar mudanças sugeridas:
Swift
// Set the initial lighting mode on launch or setup.
mapView.lightingMode = mapView.navigator?.suggestedLightingMode ?? .normal
// 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
// Set the initial lighting mode on launch or setup.
_mapView.lightingMode = _mapView.navigator.suggestedLightingMode;
// 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;
}
Para mais informações sobre a configuração automática e manual do modo de iluminação, consulte Configurar os modos normal e de pouca luz.