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
L'SDK Navigation per iOS fornisce listener
associati alla posizione dell'utente e alle condizioni lungo il percorso, nonché
importanti dati 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 del 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 man mano che cambia il tempo per raggiungere la destinazione successiva, mentre la guida è attiva.GMSNavigatorListener.didUpdateRemainingDistance
, chiamato ripetutamente man mano che la distanza dalla destinazione successiva cambia, mentre la guida è 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 man mano che la posizione dell'utente cambia.
Visualizza il codice
Dichiarazione di conformità ai protocolli richiesti
Prima di implementare i metodi di navigazione, il controller della 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 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 | La coordinata della latitudine attuale allineata alla strada. |
coordinate.longitude | La coordinata di longitudine attuale allineata alla strada. |
corso | Orientamento attuale in gradi. |
velocità | 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 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 la guida e passare al waypoint successivo
chiamando continueToNextDestination()
e riattivando la guida. La tua app
deve riattivare la guida dopo aver chiamato continueToNextDestination()
.
Dopo che l'app chiama continueToNextDestination
, il navigatore non ha più
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:
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 al 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 di percorrenza fino alla destinazione
Per ricevere aggiornamenti continui sul tempo di arrivo a 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 raggiungere 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, alla 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 dalla 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 resto del percorso,
crea un metodo per gestire l'evento didUpdateDelayCategory
. Una chiamata a
delayCategoryToNextDestination
restituisce GMSNavigationDelayCategory
che
fornisce un valore da 0 a 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 1-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 : |
l'itinerario. | |
GMSNavigationDelayCategoryHeavy | 1 - Pesante. |
GMSNavigationDelayCategoryMedium | 2 - Media. |
GMSNavigationDelayCategoryLight | 3 - Leggera. |
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); }
Modificare la modalità di illuminazione suggerita
Per ricevere aggiornamenti sulle variazioni 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; }