Utilizza questa guida per consentire alla tua app di ascoltare e rispondere a una serie di eventi che cambiano man mano che un utente naviga lungo un percorso. Questa guida non illustra la definizione di un percorso, ma solo la risposta agli eventi lungo un percorso.
Panoramica
L'SDK Navigation per iOS fornisce listener associati alla posizione dell'utente e alle condizioni lungo il percorso, nonché dati importanti su tempo e distanza. Sul controller di visualizzazione della mappa, l'app deve adottare i protocolli per questi listener: GMSRoadSnappedLocationProviderListener e GMSNavigatorListener.
Questo elenco mostra i metodi di listener disponibili per gli eventi di navigazione:
GMSNavigatorListener.didArriveAtWaypoint, attivato quando viene raggiunta una destinazione.GMSNavigatorListener.navigatorDidChangeRoute, attivato quando il percorso cambia.GMSNavigatorListener.didUpdateRemainingTime, chiamato ripetutamente quando cambia il tempo per raggiungere la destinazione successiva, mentre la guida è attiva.GMSNavigatorListener.didUpdateRemainingDistance, chiamato ripetutamente quando la distanza dalla destinazione successiva cambia, mentre la navigazione è attiva.GMSNavigatorListener.didUpdateDelayCategory, chiamato quando la categoria di ritardo per la destinazione successiva cambia, mentre la guida è attiva.GMSNavigatorListener.didChangeSuggestedLightingMode, attivato quando le condizioni di illuminazione stimate vengono aggiornate. Ad esempio, quando cala la notte nella posizione attuale dell'utente, l'illuminazione cambia.GMSNavigatorListener.didUpdateSpeedingPercentage, attivato quando il conducente supera il limite di velocità.GMSRoadSnappedLocationProviderListener.didUpdateLocation, chiamato ripetutamente quando la posizione dell'utente cambia.
Visualizza il codice
Dichiarazione di conformità ai protocolli richiesti
Prima di implementare i metodi di navigazione, il view controller deve adottare i protocolli:
Swift
class ViewController:
UIViewController,
GMSNavigatorListener,
GMSRoadSnappedLocationProviderListener
{
}
Objective-C
@interface ViewController () <GMSNavigatorListener, GMSRoadSnappedLocationProviderListener>
@end
Dopo aver adottato i protocolli di navigazione, imposta i listener sul view controller. Ad esempio, puoi aggiungere il seguente codice al metodo viewDidLoad().
Swift
mapView.navigator?.add(self)
mapView.roadSnappedLocationProvider?.add(self)
Objective-C
[_mapView.navigator addListener:self];
[_mapView.roadSnappedLocationProvider addListener:self];
Ricezione o interruzione degli aggiornamenti della posizione
Gli aggiornamenti della posizione sono necessari per mostrare i progressi dell'utente sulla mappa.
L'istanza location espone le seguenti proprietà:
| Proprietà della posizione | Descrizione |
|---|---|
| altitudine | Altitudine attuale. |
| coordinate.latitude | Coordinata di latitudine attuale agganciata alla strada. |
| coordinate.longitude | Coordinata di longitudine attuale agganciata alla strada. |
| corso | Direzione attuale in gradi. |
| velocità | Velocità attuale. |
| timestamp | Data/ora della lettura corrente. |
Per ricevere aggiornamenti continui sulla posizione, chiama
mapView.roadSnappedLocationProvider.startUpdatingLocation e utilizza
GMSRoadSnappedLocationProviderListener per gestire l'evento
didUpdateLocation.
L'esempio seguente mostra la chiamata di startUpdatingLocation:
Swift
mapView.roadSnappedLocationProvider.startUpdatingLocation()
Objective-C
[_mapView.roadSnappedLocationProvider startUpdatingLocation];
Il seguente codice crea un GMSRoadSnappedLocationProviderListener che gestisce l'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);
}
Per ricevere aggiornamenti sulla posizione quando l'app è in background, imposta allowsBackgroundLocationUpdates su true:
Swift
mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = true
Objective-C
_mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = YES;
Rilevamento degli eventi di arrivo
La tua app utilizza l'evento didArriveAtWaypoint per rilevare quando è stata raggiunta una destinazione. Puoi riprendere le indicazioni e passare al waypoint successivo chiamando continueToNextDestinationWithCompletion() e riattivando le indicazioni. L'app deve riattivare le indicazioni dopo aver chiamato
continueToNextDestinationWithCompletion().
Dopo che l'app chiama continueToNextDestinationWithCompletion, il navigatore non ha più dati sulla destinazione precedente. Se vuoi analizzare le informazioni su una tappa del percorso, devi recuperarle dal navigatore prima di chiamare continueToNextDestinationWithCompletion().
Il seguente esempio di codice mostra un metodo per gestire l'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;
}
Ricezione di aggiornamenti sulle modifiche del percorso
Per ricevere una notifica ogni volta che il percorso viene modificato, crea un metodo per gestire l'evento navigatorDidChangeRoute. Puoi accedere alla nuova route utilizzando le proprietà routeLegs e currentRouteLeg di GMSNavigator.
Swift
func navigatorDidChangeRoute(_ navigator: GMSNavigator) {
print("The route has changed.")
}
Objective-C
- (void)navigatorDidChangeRoute:(GMSNavigator *)navigator {
NSLog(@"The route has changed.");
}
Ricezione di aggiornamenti sul tempo per arrivare a destinazione
Per ricevere aggiornamenti continui sul tempo di percorrenza fino alla destinazione, crea un metodo per gestire l'evento didUpdateRemainingTime. Il parametro time fornisce il tempo stimato, in secondi, fino al raggiungimento della destinazione successiva.
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);
}
Per impostare la variazione minima del tempo stimato per la destinazione successiva, imposta la proprietà timeUpdateThreshold su GMSNavigator. Il valore è specificato in secondi. Se questa proprietà non è impostata, i servizi utilizzano un valore predefinito di un secondo.
Swift
navigator?.timeUpdateThreshold = 10
Objective-C
navigator.timeUpdateThreshold = 10;
Ricezione di aggiornamenti sulla distanza dalla destinazione
Per ricevere aggiornamenti continui sulla distanza dalla destinazione, crea un metodo per gestire l'evento didUpdateRemainingDistance. Il parametro distance fornisce la distanza stimata, in metri, dalla destinazione successiva.
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]);
}
Per impostare la variazione minima della distanza stimata fino alla destinazione successiva, imposta la proprietà distanceUpdateThreshold su GMSNavigator (il valore è specificato in metri). Se questa proprietà non è impostata, i servizi utilizzano un valore predefinito di un metro.
Swift
navigator?.distanceUpdateThreshold = 100
Objective-C
navigator.distanceUpdateThreshold = 100;
Ricezione di aggiornamenti sul traffico
Per ricevere aggiornamenti continui sul flusso del traffico per il percorso rimanente,
crea un metodo per gestire l'evento didUpdateDelayCategory. Una chiamata a delayCategoryToNextDestination restituisce GMSNavigationDelayCategory, che fornisce un valore compreso tra 0 e 3. Gli aggiornamenti alla categoria si basano sulla posizione corrente dell'utente dell'app. Se i dati sul traffico non sono disponibili, GMSNavigationDelayCategory restituisce 0. I numeri da 1 a 3 indicano un flusso crescente, da leggero 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);
}
La proprietà GMSNavigationDelayCategory espone i seguenti livelli di ritardo:
| Categoria di ritardo | Descrizione |
|---|---|
| GMSNavigationDelayCategoryNoData | 0 - Non disponibile, nessun dato sul traffico o : |
| il percorso. | |
| GMSNavigationDelayCategoryHeavy | 1 - Intenso. |
| GMSNavigationDelayCategoryMedium | 2 - Media. |
| GMSNavigationDelayCategoryLight | 3 - Leggero. |
Ricezione di aggiornamenti sulla velocità
Per ricevere aggiornamenti quando un conducente supera il limite di velocità, crea un metodo per gestire l'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);
}
Modifica della modalità Luce suggerita
GMSNavigator
calcola la modalità di illuminazione suggerita in base all'ora del giorno e alla
posizione del dispositivo e chiama il
metodo listener
didChangeSuggestedLightingMode
solo quando la modalità suggerita cambia (ad esempio all'alba o
al tramonto). Per assicurarti che la mappa venga avviata con la modalità Luce appropriata quando l'utente avvia l'app, imposta mapView.lightingMode su suggestedLightingMode del navigatore durante l'inizializzazione e implementa didChangeSuggestedLightingMode per gestire le modifiche successive.
L'esempio seguente mostra come impostare la modalità Luce iniziale e rimanere in ascolto per le modifiche suggerite alla modalità Luce:
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;
}
Per saperne di più sulla configurazione della modalità di illuminazione automatica e manuale, consulta Configura le modalità Normale e Luce scarsa.