Use este guia para permitir que seu aplicativo escute e responda a vários eventos que mudam à medida que o usuário navega ao longo de uma rota. Este guia não abrange definir uma rota, respondendo apenas a eventos ao longo dela.
Visão geral
O SDK do Navigation para iOS oferece listeners
associadas à localização do usuário e às condições ao longo do trajeto e
dados importantes de tempo e distância. No controlador de visualização do mapa, seu app
precisa adotar os protocolos para esses 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 à medida que a hora até o próximo destino muda, enquanto orientação está ativa.GMSNavigatorListener.didUpdateRemainingDistance
, chamadas repetidamente à medida que a distância até o próximo destino muda, enquanto orientação está ativa.GMSNavigatorListener.didUpdateDelayCategory
, chamado quando a categoria de atraso para o próximo destino muda, enquanto 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
, chamados repetidamente à medida que a localização 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 controlador de visualização precisa adotar o 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 a visualização
de controle de acesso. Por exemplo, adicione o seguinte código ao arquivo 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. |
timestamp | Data/hora da leitura atual. |
Para receber atualizações contínuas do local, ligue
mapView.roadSnappedLocationProvider.startUpdatingLocation
, e use o método
GMSRoadSnappedLocationProviderListener
para gerenciar o didUpdateLocation
.
evento.
O exemplo a seguir mostra como chamar startUpdatingLocation
:
Swift
mapView.roadSnappedLocationProvider.startUpdatingLocation()
Objective-C
[_mapView.roadSnappedLocationProvider startUpdatingLocation];
O código abaixo cria uma 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;
Detectando eventos de chegada
O app usa o evento didArriveAtWaypoint
para detectar quando um destino
foram alcançados. Você pode retomar a orientação e avançar para o próximo ponto de referência
chamando continueToNextDestination()
e reativando as orientações. Seu app
precisa reativar a orientação depois de 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, você deve recuperá-lo no navegador antes de chamar
continueToNextDestination()
:
O exemplo de código a seguir mostra um método para processar o didArriveAtWaypoint
.
evento:
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 lidar com as
didUpdateRemainingTime
. O parâmetro time
fornece o valor
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 o
Propriedade timeUpdateThreshold
em GMSNavigator
. O valor é especificado em
segundos. Se esta propriedade não for definida, os serviços usarão um valor padrão de um
segundo.
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
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 alteração mínima da distância estimada até o próximo destino, defina o
Propriedade distanceUpdateThreshold
em GMSNavigator
(o valor é especificado em
metros). Se esta propriedade não for definida, os serviços usarão um valor padrão de um
metro.
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ânsito no 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
posição do usuário do aplicativo. Se os dados de trânsito não estiverem disponíveis,
GMSNavigationDelayCategory
retorna 0. Os números, de 1 a 3, indicam aumento
fluem do leve ao 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 as mudanças estimadas de iluminação, crie um método para gerenciar
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; }