Ascolta gli eventi di navigazione

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 tratta la definizione di un percorso, ma solo la risposta agli eventi lungo un percorso.

Panoramica

Navigation SDK for iOS fornisce listener associati alla posizione dell'utente e alle condizioni lungo il percorso, nonché dati importanti su tempo e distanza. Nel controller di visualizzazione della mappa, la tua app deve adottare i protocolli per questi listener: GMSRoadSnappedLocationProviderListener e GMSNavigatorListener.

Questo elenco mostra i metodi di listener disponibili per gli eventi di navigazione:

Visualizzare il codice

Dichiarare la conformità ai protocolli richiesti

Prima di implementare i metodi di navigazione, il controller di visualizzazione 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 controller di visualizzazione. 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];

Ricevere o interrompere gli aggiornamenti sulla posizione

Gli aggiornamenti sulla posizione sono necessari per mostrare i progressi dell'utente sulla mappa.

L'istanza location espone le seguenti proprietà:

Proprietà della posizione Descrizione
altitude Altitudine attuale.
coordinate.latitude Coordinata della latitudine attuale allineata alla strada.
coordinate.longitude Coordinata della longitudine attuale allineata alla strada.
course Orientamento attuale in gradi.
speed Velocità attuale.
timestamp Data/ora della lettura attuale.

Per ricevere aggiornamenti continui sulla posizione, chiama mapView.roadSnappedLocationProvider.startUpdatingLocation e utilizza GMSRoadSnappedLocationProviderListener per gestire l'evento didUpdateLocation.

L'esempio seguente mostra la chiamata a 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;

Rilevare gli eventi di arrivo

La tua app utilizza l'evento didArriveAtWaypoint per rilevare quando è stata raggiunta una destinazione. Puoi riprendere la guida e passare al waypoint successivo chiamando continueToNextDestinationWithCompletion() e poi riattivando la guida. La tua app deve riattivare la guida dopo aver chiamato continueToNextDestinationWithCompletion().

Dopo che l'app chiama continueToNextDestinationWithCompletion, il navigatore non ha più dati sulla destinazione precedente. Se vuoi analizzare i dati e analisi su una tratta del percorso, devi recuperarli 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;
}

Ricevere 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 al nuovo percorso 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.");
}

Ricevere aggiornamenti sul tempo per raggiungere la destinazione

Per ricevere aggiornamenti continui sul tempo per raggiungere la destinazione, crea un metodo per gestire l'evento didUpdateRemainingTime. Il parametro time fornisce il tempo stimato, in secondi, fino al raggiungimento della prossima destinazione.

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 modifica minima del tempo stimato per raggiungere la prossima destinazione, 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;

Ricevere 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 prossima destinazione.

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 modifica minima della distanza stimata dalla prossima destinazione, 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;

Ricevere aggiornamenti sul traffico

Per ricevere aggiornamenti continui sul flusso di traffico per il percorso rimanente, crea un metodo per gestire l'evento didUpdateDelayCategory. Una chiamata a delayCategoryToNextDestination restituisce GMSNavigationDelayCategory, che fornisce un valore da 0 a 3. Gli aggiornamenti della categoria si basano sulla posizione attuale 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 :
sul percorso.
GMSNavigationDelayCategoryHeavy 1 - Intenso.
GMSNavigationDelayCategoryMedium 2 - Medio.
GMSNavigationDelayCategoryLight 3 - Leggero.

Ricevere 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);
}

Modificare la modalità di illuminazione suggerita

Per ricevere aggiornamenti sulle modifiche stimate dell'illuminazione, crea un metodo per gestire l'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;
}