Use este guia para permitir que seu app detecte e responda a vários eventos que mudam conforme o usuário navega ao longo de um trajeto. 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 do Navigation para iOS oferece listeners associados ao local 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 para estes listeners: GMSRoadSnappedLocationProviderListener
e GMSNavigatorListener
.
Esta lista mostra os métodos do listener disponíveis para eventos de navegação:
GMSNavigatorListener.didArriveAtWaypoint
, acionada quando um destino é alcançado.GMSNavigatorListener.navigatorDidChangeRoute
, acionada quando a rota muda.GMSNavigatorListener.didUpdateRemainingTime
, chamado repetidamente conforme 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
, acionada 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
, acionada quando o motorista ultrapassa o limite de velocidade.GMSRoadSnappedLocationProviderListener.didUpdateLocation
, chamado repetidamente à medida que a localização do usuário muda.
Confira o código
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, é possível 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 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 do local | Descrição |
---|---|
altitude | Altitude atual. |
coordinate.latitude | Coordenada de latitude atual da via. |
coordinate.longitude | Coordenada de longitude atual capturada pela via. |
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 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 "true":
Swift
mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = true
Objective-C
_mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = YES;
Detectando 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 as orientações após 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, extraia essas informações no 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; }
Recebendo 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."); }
Recebendo atualizações do tempo até o destino
Para receber atualizações de tempo contínuo 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 a 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;
Receber 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, 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 a propriedade não for definida, o valor padrão de um medidor será usado pelos serviços.
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 do 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
vai retornar 0. Os números, de 1 a 3, indicam
um aumento do fluxo 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 : |
ao longo do trajeto. | |
GMSNavigationDelayCategoryHeavy | 1 - Intensa. |
GMSNavigationDelayCategoryMedium | 2 - Médio. |
GMSNavigationDelayCategoryLight | 3 - Leve. |
Recebendo atualizações sobre velocidade
Para receber atualizações quando um motorista exceder 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 alterar o modo de iluminação sugerido
Para receber atualizações sobre mudanças estimadas de 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; }