Ascolta gli eventi di navigazione

Usa questa guida per consentire alla tua app di ascoltare e rispondere a una varietà di eventi che cambiano mentre l'utente percorre un percorso. Questa guida non tratta definendo un percorso, rispondendo solo agli eventi lungo il percorso.

Panoramica

L'SDK di navigazione per iOS fornisce listener associate alla posizione dell'utente e alle condizioni lungo il percorso, dati importanti su tempi e distanze. Nel controller di visualizzazione della mappa, la tua app deve adottare i protocolli per questi ascoltatori: GMSRoadSnappedLocationProviderListener e GMSNavigatorListener.

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

di Gemini Advanced.

Visualizza il codice

Dichiarazione di conformità ai protocolli richiesti

Prima di implementare i metodi di navigazione, il controller di visualizzazione deve adottare protocolli:

Swift

class ViewController: UIViewController, GMSNavigatorListener,
GMSRoadSnappedLocationProviderListener {

Objective-C

@interface ViewController () <GMSNavigatorListener,
GMSRoadSnappedLocationProviderListener>

@end

Dopo l'adozione dei protocolli di navigazione, imposta i listener sulla visualizzazione un controller di deployment. Ad esempio, puoi aggiungere il seguente codice alla sezione viewDidLoad() .

Swift

mapView.navigator?.add(self) mapView.roadSnappedLocationProvider?.add(self)

Objective-C

[_mapView.navigator addListener:self]; [_mapView.roadSnappedLocationProvider
addListener:self];

Ricezione o interruzione di 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à posizione Descrizione
altitudine Altitudine attuale.
coordinate.latitude Coordinata di latitudine attuale agganciata alla strada.
coordinate.longitude La coordinata della longitudine attuale con l'allineamento della strada.
corso Rilevamento della corrente 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 didUpdateLocation .

L'esempio seguente mostra la chiamata a startUpdatingLocation:

Swift

mapView.roadSnappedLocationProvider.startUpdatingLocation()

Objective-C

[_mapView.roadSnappedLocationProvider startUpdatingLocation];

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 in arrivo

La tua app utilizza l'evento didArriveAtWaypoint per rilevare quando una destinazione ha raggiunto. Puoi riprendere le indicazioni e passare alla tappa successiva chiamata al numero continueToNextDestination() e poi riattivazione delle indicazioni. La tua app deve riattivare le indicazioni dopo aver chiamato continueToNextDestination().

Dopo che l'app chiama continueToNextDestination, il navigatore non avrà più e i dati relativi alla destinazione precedente. Se vuoi analizzare le informazioni su un tratto del percorso, devi recuperarlo dal navigatore prima di chiamare continueToNextDestination().

L'esempio di codice seguente mostra un metodo per gestire didArriveAtWaypoint dell'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; }

Ricezione di aggiornamenti sulle modifiche del percorso

Per ricevere una notifica ogni volta che il percorso viene modificato, crea un metodo per 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."); }

Ricezione aggiornamenti sull'ora di arrivo alla destinazione

Per ricevere aggiornamenti continui del tempo necessario per arrivare alla destinazione, crea un metodo per gestire didUpdateRemainingTime evento. Il parametro time fornisce la stima 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 il parametro Proprietà timeUpdateThreshold in GMSNavigator. Il valore è specificato in secondi. Se questa proprietà non è impostata, i servizi utilizzano il valore predefinito di uno 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 il parametro distanza stimata, in metri, per la 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 per la destinazione successiva, imposta la Proprietà distanceUpdateThreshold su GMSNavigator (il valore è specificato in metri). Se questa proprietà non è impostata, i servizi utilizzano il valore predefinito di uno metro.

Swift

navigator?.distanceUpdateThreshold = 100

Objective-C

navigator.distanceUpdateThreshold = 100;

Ricezione di aggiornamenti sul traffico

Per ricevere aggiornamenti continui del 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 compreso tra 0 e 3. Gli aggiornamenti della categoria si basano sul rendimento attuale posizione dell'utente dell'app. Se i dati sul traffico non sono disponibili, GMSNavigationDelayCategory restituisce 0. I numeri, 1-3, indicano un aumento passare da leggera a intensa.

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 :
lungo il percorso.
GMSNavigationDelayCategoryHeavy 1 - Intenso.
GMSNavigationDelayCategoryMedium 2 - Medio.
GMSNavigationDelayCategoryLight 3 - Luce.

Ricezione di aggiornamenti sulla velocità

Crea un metodo per ricevere aggiornamenti quando un conducente supera il limite di velocità 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à di illuminazione suggerita

Per ricevere aggiornamenti sui cambiamenti stimati relativi all'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; }