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:
GMSNavigatorListener.didArriveAtWaypoint
, vengono attivati quando viene raggiunta una destinazione.GMSNavigatorListener.navigatorDidChangeRoute
, quando il percorso viene modificato.GMSNavigatorListener.didUpdateRemainingTime
, chiamato ripetutamente quando cambia l'ora per arrivare alla destinazione successiva, sia attiva.GMSNavigatorListener.didUpdateRemainingDistance
, chiamata ripetutamente quando la distanza dalla destinazione successiva cambia, mentre sia attiva.GMSNavigatorListener.didUpdateDelayCategory
, viene richiamata quando la categoria di ritardo alla destinazione successiva cambia, mentre sia attiva.GMSNavigatorListener.didChangeSuggestedLightingMode
, si attiva quando le condizioni di illuminazione stimate vengono aggiornate. Ad esempio: quando scende la notte nella posizione attuale dell'utente, l'illuminazione cambia.GMSNavigatorListener.didUpdateSpeedingPercentage
, si attiva quando il conducente supera il limite di velocità.GMSRoadSnappedLocationProviderListener.didUpdateLocation
, chiamata ripetutamente quando la località dell'utente cambia.
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; }