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:
GMSNavigatorListener.didArriveAtWaypoint
, acionado quando um destino é alcançado.GMSNavigatorListener.navigatorDidChangeRoute
, acionado quando a rota muda.GMSNavigatorListener.didUpdateRemainingTime
, chamada repetidamente quando o tempo para o próximo destino muda, enquanto o trajeto está ativo.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?
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; }