Ascolta gli eventi di navigazione

Utilizza questa guida per consentire alla tua app di ascoltare e rispondere a una serie di eventi che cambiano quando un utente naviga lungo un percorso. Questa guida non tratta la definizione di un percorso, ma solo la risposta agli eventi lungo il percorso.

Panoramica

L'SDK di navigazione 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, la tua app deve adottare i protocolli per questi listener: GMSRoadSnappedLocationProviderListener e GMSNavigatorListener.

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

Visualizza il codice

Dichiarazione di 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=""></gmsnavigatorlistener,>

@fine

Dopo aver adottato i protocolli di navigazione, imposta i listener come 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];

Ricezione o interruzione degli aggiornamenti sulla posizione

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

L'istanza location espone le seguenti proprietà:

Proprietà località Descrizione
altitudine Altitudine attuale.
coordinate.latitude Coordinata della latitudine attuale allineata alla strada.
coordinate.longitude Coordinata della longitudine attuale allineata alla strada.
corso Orientamento 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.

Nell'esempio seguente viene mostrata la chiamata a startUpdatingLocation:

Swift

mapView.roadSnappedLocationProvider.startUpdatingLocation()

Objective-C

[_mapView.roadSnappedLocationProvider start accertatiLocation];

Il codice seguente crea un elemento 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

L'app utilizza l'evento didArriveAtWaypoint per rilevare quando è stata raggiunta una destinazione. Puoi riprendere le indicazioni e passare al waypoint successivo chiamando continueToNextDestination(), quindi riattivando le indicazioni. L'app deve riattivare le indicazioni dopo aver chiamato il numero continueToNextDestination().

Dopo che l'app chiama continueToNextDestination, il navigatore non dispone più dei dati sulla destinazione precedente. Se vuoi analizzare le informazioni su un tratto di percorso, devi recuperarle dal navigatore prima di chiamare continueToNextDestination().

Il seguente esempio di codice mostra un metodo per gestire l'evento didArriveAtWaypoint:

Swift

func navigator(_ navigator: GMSNavigator, didArriveAt waypoint: GMSGMSNavigatorWaypoint) { print("You have arrive at: (waypoint.title)") mapView.navigator?.continueToNextDestination() mapView.navigator?.isGuidanceActive = true }

Objective-C

  • (void)navigator:(GMSNavigator *)navigator didArriveAtWaypoint:(GMSNavigatorWaypoint *)waypoint { NSLog(@"You have arrived at: %@", waypoint.title); [_mapView.navigator continueToNextDestination]; _mapView.navigator.guidanceActive = YES; }

Ricezione di aggiornamenti sulle modifiche al percorso

Per ricevere una notifica ogni volta che la route viene modificata, 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: GMS) { print("Il percorso è cambiato.") }

Objective-C

  • (void)navigatorDidChangeRoute:(GMSNavigator *)navigator { NSLog(@"The route has changed."); }

Ricezione di aggiornamenti sull'orario di arrivo a destinazione

Per ricevere aggiornamenti continui 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 arrivare alla destinazione successiva, imposta la proprietà timeUpdateThreshold su GMSNavigator. Il valore viene specificato in secondi. Se questa proprietà non è impostata, i servizi utilizzano un valore predefinito di 1 secondo.

Swift

navigator?.timeUpdateThreshold = 10

Objective-C

navigator.timeUpdateThreshold = 10;

Aggiornamenti sulla distanza di ricezione alla 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, fino alla destinazione successiva.

Swift

func navigator(_ navigator: GMSNavigator, didUpdateRemainingDistance distanza: CLLocationDistanza) {let miglio = distanza * 0.00062137 print("Distanza dalla destinazione successiva: (miglia) miglia.") }

Objective-C

  • (void)navigator:(GMSNavigator *)navigator didUpdateRemainingDistance:(CLLocationD)distance { double miglio = distanza * 0,00062137; NSLog(@"%@", [NSString stringWithFormat:@"Distanza dalla destinazione successiva: %.2f.", miglio]); }

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 1 metro.

Swift

navigator?.distanceUpdateThreshold = 100

Objective-C

navigator.distanceUpdateThreshold = 100;

Ricezione di aggiornamenti sul traffico

Per ricevere aggiornamenti continui del flusso di traffico per la route 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 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 limitCategory: GMSNavigatorDelayCategory) { print("Flusso di traffico verso la destinazione successiva: (delayCategory)") }

Objective-C

  • (void)navigator:(GMSNavigator *)navigator didUpdateDelayCategory:(GMS NavigationDelayCategory)delayCategory { NSLog(@"Traffico verso la destinazione successiva: %ld", (long)delayCategory); }

La proprietà GMSNavigationDelayCategory mostra i seguenti livelli di ritardo:

Categoria ritardo Descrizione
GMSNavigationDelayCategoryNoData 0 - Non disponibile, nessun dato sul traffico oppure :
del percorso.
GMSNavigationDelayCategoryHeavy 1 - Intenso.
GMSNavigationDelayCategoryMedium 2 - Media.
GMSNavigationDelayCategoryLight 3 - Leggero.

Aggiornamenti sulla velocità di ricezione

Per ricevere aggiornamenti quando un conducente supera il limite di velocità, crea un metodo per gestire l'evento didUpdateSpeedingPercentage.

Swift

// Listener per gestire gli eventi di velocità. func navigator( _ navigator: GMSNavigator, didUpdateSpeedingPercentage percentageAboveLimit: CGFloat ) { print("Speed is (percentageAboveLimit) above the limit.") }

Objective-C

// Listener per la gestione degli eventi di velocità. - (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 variazioni stimate dell'illuminazione, crea un metodo per gestire l'evento didChangeSuggestedLightingMode.

Swift

// Definisci un listener per le modifiche suggerite alla modalità illuminazione. func navigator(_ navigator: GMSNavigator, didChangeSuggestedLightingMode lightMode: GMSNavigatorLightingMode) { print("Suggested lighting mode has changed: (String(describing: lightsMode))")

// Apporta la modifica suggerita. mapView.lightingMode = lightMode }

Objective-C

// Definisci un listener per le modifiche suggerite alla modalità Luce. -(void)navigator:(GMSNavigator *)navigator didChangeSuggestedLightingMode: (GMSNavigatorLightingMode)lightingMode { NSLog(@"Suggested lighting mode has changed: %ld", (long)lightingMode);

// Apporta la modifica suggerita. _mapView.lightingMode = lightMode; }