In diesem Leitfaden erfahren Sie, wie Sie Ihre App so konfigurieren, dass sie auf verschiedene Ereignisse reagieren kann, die sich ändern, wenn ein Nutzer einer Route folgt. In diesem Leitfaden wird nicht beschrieben, wie eine Route definiert wird, sondern nur, wie auf Ereignisse entlang einer Route reagiert wird.
Übersicht
Das Navigation SDK for iOS bietet Listener für den Standort des Nutzers, die Bedingungen entlang der Route sowie wichtige Zeit- und Entfernungsdaten. Im Ansichtscontroller der Karte muss Ihre App
die Protokolle für diese Listener übernehmen:
GMSRoadSnappedLocationProviderListener
und
GMSNavigatorListener.
Diese Liste enthält die Listener-Methoden, die für Navigationsereignisse verfügbar sind:
GMSNavigatorListener.didArriveAtWaypoint: Wird ausgelöst, wenn ein Ziel erreicht wurde.GMSNavigatorListener.navigatorDidChangeRoute: Wird ausgelöst, wenn sich die Route ändert.GMSNavigatorListener.didUpdateRemainingTime: Wird wiederholt aufgerufen, wenn sich die Zeit bis zum nächsten Ziel ändert, während die Navigation aktiv ist.GMSNavigatorListener.didUpdateRemainingDistance: Wird wiederholt aufgerufen, wenn sich die Entfernung zum nächsten Ziel ändert, während die Navigation aktiv ist.GMSNavigatorListener.didUpdateDelayCategory: Wird aufgerufen, wenn sich die Verzögerungskategorie zum nächsten Ziel ändert, während die Navigation aktiv ist.GMSNavigatorListener.didChangeSuggestedLightingMode: Wird ausgelöst, wenn die geschätzten Lichtverhältnisse aktualisiert werden. Beispiel: Wenn es am aktuellen Standort des Nutzers Nacht wird, ändert sich die Beleuchtung.GMSNavigatorListener.didUpdateSpeedingPercentage: Wird ausgelöst, wenn der Fahrer die Geschwindigkeitsbegrenzung überschreitet.GMSRoadSnappedLocationProviderListener.didUpdateLocation: Wird wiederholt aufgerufen, wenn sich der Standort des Nutzers ändert.
Code
Konformität mit den erforderlichen Protokollen deklarieren
Vor der Implementierung der Navigationsmethoden muss der Ansichtscontroller die Protokolle übernehmen:
Swift
class ViewController: UIViewController, GMSNavigatorListener,
GMSRoadSnappedLocationProviderListener {
Objective-C
@interface ViewController () <GMSNavigatorListener,
GMSRoadSnappedLocationProviderListener>
@end
Nachdem Sie die Navigationsprotokolle übernommen haben, legen Sie die Listener für den Ansichtscontroller fest. Sie können beispielsweise den folgenden Code zur Methode viewDidLoad() hinzufügen.
Swift
mapView.navigator?.add(self) mapView.roadSnappedLocationProvider?.add(self)
Objective-C
[_mapView.navigator addListener:self]; [_mapView.roadSnappedLocationProvider
addListener:self];
Standortaktualisierungen erhalten oder beenden
Standortaktualisierungen sind erforderlich, um den Fortschritt des Nutzers auf der Karte zu sehen.
Die location-Instanz stellt die folgenden Eigenschaften bereit:
| Standorteigenschaft | Beschreibung |
|---|---|
| Höhe | Aktuelle Höhe. |
| coordinate.latitude | Aktuelle Breitengradkoordinate. |
| coordinate.longitude | Aktuelle Längengradkoordinate. |
| Kurs | Aktueller Kurs in Grad. |
| Geschwindigkeit | Aktuelle Geschwindigkeit. |
| Zeitstempel | Datum/Uhrzeit der aktuellen Messung. |
Wenn Sie kontinuierliche Standortaktualisierungen erhalten möchten, rufen Sie mapView.roadSnappedLocationProvider.startUpdatingLocation auf und verwenden Sie GMSRoadSnappedLocationProviderListener , um das Ereignis didUpdateLocation zu verarbeiten.
Hier sehen Sie, wie startUpdatingLocation aufgerufen wird:
Swift
mapView.roadSnappedLocationProvider.startUpdatingLocation()
Objective-C
[_mapView.roadSnappedLocationProvider startUpdatingLocation];
Der folgende Code erstellt einen GMSRoadSnappedLocationProviderListener, der das Ereignis didUpdateLocation verarbeitet.
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); }
Wenn Sie Standortaktualisierungen erhalten möchten, wenn die App im Hintergrund ausgeführt wird, legen Sie allowsBackgroundLocationUpdates auf „true“ fest:
Swift
mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = true
Objective-C
_mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = YES;
Ereignisse bei Ankunft erkennen
Ihre App verwendet das Ereignis didArriveAtWaypoint, um zu erkennen, wann ein Ziel erreicht wurde. Sie können die Navigation fortsetzen und zum nächsten Wegpunkt wechseln, indem Sie continueToNextDestination() aufrufen und die Navigation dann wieder aktivieren. Ihre App muss die Navigation nachdem continueToNextDestination() aufgerufen wurde, wieder aktivieren.
Nachdem die App continueToNextDestination aufgerufen hat, hat der Navigator keine Daten mehr zum vorherigen Ziel. Wenn Sie Informationen zu einer Routenstrecke analysieren möchten, müssen Sie diese vor dem Aufruf von continueToNextDestination() vom Navigator abrufen.
Das folgende Codebeispiel zeigt eine Methode zum Verarbeiten des Ereignisses 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; }
Updates zu Routenänderungen erhalten
Wenn Sie eine Benachrichtigung erhalten möchten, wenn sich die Route ändert, erstellen Sie eine Methode zum Verarbeiten des Ereignisses navigatorDidChangeRoute. Sie können mit den Eigenschaften routeLegs und currentRouteLeg von GMSNavigator auf die neue Route zugreifen.
Swift
func navigatorDidChangeRoute(_ navigator: GMSNavigator) { print("The route has
changed.") }
Objective-C
- (void)navigatorDidChangeRoute:(GMSNavigator *)navigator { NSLog(@"The route
has changed."); }
Updates zur Zeit bis zum Ziel erhalten
Wenn Sie kontinuierliche Updates zur Zeit bis zum Ziel erhalten möchten, erstellen Sie eine Methode zum Verarbeiten des Ereignisses didUpdateRemainingTime. Der Parameter time gibt die geschätzte Zeit in Sekunden an, bis das nächste Ziel erreicht wird.
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); }
Legen Sie die Eigenschaft timeUpdateThreshold für GMSNavigator fest, um die minimale Änderung der geschätzten Zeit bis zum nächsten Ziel festzulegen. Der Wert wird in Sekunden angegeben. Wenn diese Eigenschaft nicht festgelegt ist, verwenden die Dienste den Standardwert von einer Sekunde.
Swift
navigator?.timeUpdateThreshold = 10
Objective-C
navigator.timeUpdateThreshold = 10;
Updates zur Entfernung zum Ziel erhalten
Wenn Sie kontinuierliche Updates zur Entfernung zum Ziel erhalten möchten, erstellen Sie eine Methode zum Verarbeiten des Ereignisses didUpdateRemainingDistance. Der Parameter distance gibt die geschätzte Entfernung in Metern zum nächsten Ziel an.
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]); }
Legen Sie die Eigenschaft distanceUpdateThreshold für GMSNavigator fest, um die minimale Änderung der geschätzten Entfernung zum nächsten Ziel festzulegen. Der Wert wird in Metern angegeben. Wenn diese Eigenschaft nicht festgelegt ist, verwenden die Dienste den Standardwert von einem Meter.
Swift
navigator?.distanceUpdateThreshold = 100
Objective-C
navigator.distanceUpdateThreshold = 100;
Verkehrsinformationen erhalten
Wenn Sie kontinuierliche Updates zum Verkehrsfluss für die verbleibende Route erhalten möchten, erstellen Sie eine Methode zum Verarbeiten des Ereignisses didUpdateDelayCategory. Ein Aufruf von delayCategoryToNextDestination gibt GMSNavigationDelayCategory zurück, das einen Wert von 0 bis 3 liefert. Updates für die Kategorie basieren auf der aktuellen Position des App-Nutzers. Wenn keine Verkehrsdaten verfügbar sind, gibt GMSNavigationDelayCategory den Wert 0 zurück. Die Zahlen 1 bis 3 geben einen zunehmenden Verkehrsfluss von leicht bis stark an.
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); }
Die Eigenschaft GMSNavigationDelayCategory stellt die folgenden Verzögerungsstufen bereit:
| Verzögerungskategorie | Beschreibung |
|---|---|
| GMSNavigationDelayCategoryNoData | 0 – Nicht verfügbar, keine Daten für Verkehr oder : |
| die Route. | |
| GMSNavigationDelayCategoryHeavy | 1 – Stark. |
| GMSNavigationDelayCategoryMedium | 2 – Mittel. |
| GMSNavigationDelayCategoryLight | 3 – Leicht. |
Updates zu Geschwindigkeitsüberschreitungen erhalten
Wenn Sie Updates erhalten möchten, wenn ein Fahrer die Geschwindigkeitsbegrenzung überschreitet, erstellen Sie eine Methode zum Verarbeiten des Ereignisses 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); }
Vorgeschlagenen Beleuchtungsmodus ändern
Wenn Sie Updates zu geschätzten Änderungen der Beleuchtung erhalten möchten, erstellen Sie eine Methode zum Verarbeiten des Ereignisses 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; }