Use este guia para ativar seu app para detectar e responder a vários eventos que mudam à medida que um 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ção do mapa, seu app
precisa adotar os protocolos desses 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 na localização atual do usuário, a iluminação muda.GMSNavigatorListener.didUpdateSpeedingPercentage, acionado quando o motorista está excedendo o limite de velocidade.GMSRoadSnappedLocationProviderListener.didUpdateLocation, chamado repetidamente à medida que a localização do usuário muda.
Achou o código?
Como 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, você pode adicionar o código a seguir 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 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 de localização | Descrição |
|---|---|
| altitude | Altitude atual. |
| coordinate.latitude | Coordenada de latitude atual. |
| coordinate.longitude | Coordenada de longitude atual. |
| course | Rolamento atual em graus. |
| speed | Velocidade atual. |
| timestamp | 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 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. Você pode retomar a orientação e avançar para o próximo waypoint chamando continueToNextDestinationWithCompletion() e reativando a orientação. Seu app precisa reativar a orientação 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 da rota, recupere essas informações 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;
}
Como receber atualizações de mudança de trajeto
Para receber uma notificação sempre que o trajeto for alterado, crie um método para processar o evento navigatorDidChangeRoute. Você pode acessar o novo trajeto 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 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 estiver 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 estiver 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ânsito 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 as informações de trânsito não estiverem disponíveis, GMSNavigationDelayCategory vai retornar 0. Os números de 1 a 3 indicam um fluxo crescente 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ânsito ou : |
| o trajeto. | |
| GMSNavigationDelayCategoryHeavy | 1 - Intenso. |
| GMSNavigationDelayCategoryMedium | 2 - Médio. |
| GMSNavigationDelayCategoryLight | 3 - Iluminação. |
Como receber atualizações de 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);
}
Como mudar o modo de iluminação sugerido
Para receber atualizações de 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;
}