In diesem Leitfaden erfahren Sie, wie Sie Ihre App so konfigurieren, dass sie auf eine Vielzahl von Ereignissen reagiert, die sich ändern, während sich ein Nutzer auf einer Route bewegt. 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 Ihnen Listener, die mit dem Standort des Nutzers und den Bedingungen entlang der Route sowie wichtigen Zeit- und Entfernungsdaten verknüpft sind. Im View Controller der Karte muss Ihre App die Protokolle für diese Listener übernehmen: GMSRoadSnappedLocationProviderListener
und GMSNavigatorListener
.
In dieser Liste sind die Listenermethoden aufgeführt, die für Navigationsereignisse verfügbar sind:
GMSNavigatorListener.didArriveAtWaypoint
, wird ausgelöst, wenn ein Ziel erreicht wird.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. Wenn es beispielsweise am aktuellen Standort des Nutzers dunkel wird, ändert sich die Beleuchtung.GMSNavigatorListener.didUpdateSpeedingPercentage
, wird ausgelöst, wenn der Fahrer die zulässige Höchstgeschwindigkeit überschreitet.GMSRoadSnappedLocationProviderListener.didUpdateLocation
, wird wiederholt aufgerufen, wenn sich der Standort des Nutzers ändert.
Code
Konformität mit den erforderlichen Protokollen erklären
Bevor die Navigationsmethoden implementiert werden, muss der View Controller die folgenden 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 der Methode viewDidLoad()
beispielsweise den folgenden Code 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 anzuzeigen.
Die location
-Instanz stellt die folgenden Eigenschaften bereit:
Standort-Property | Beschreibung |
---|---|
Höhe | Aktuelle Höhe. |
coordinate.latitude | Aktuelle Breitengradkoordinate, die an Straßen ausgerichtet ist. |
coordinate.longitude | Aktuelle Längengradkoordinate, die an einer Straße angehängt ist. |
Kurs | Aktueller Kurs in Grad. |
speed | Aktuelle Geschwindigkeit. |
timestamp | Datum und 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];
Im folgenden Code wird eine GMSRoadSnappedLocationProviderListener
erstellt, die das didUpdateLocation
-Ereignis 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, während die App im Hintergrund ausgeführt wird, setzen Sie allowsBackgroundLocationUpdates
auf „true“:
Swift
mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = true
Objective-C
_mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = YES;
Ankunftsereignisse 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()
drücken und die Navigation dann wieder aktivieren. Ihre App muss die Navigation nach dem Aufruf von continueToNextDestination()
wieder aktivieren.
Nachdem die App continueToNextDestination
aufgerufen hat, hat der Navigationsgerät keine Daten mehr zum vorherigen Ziel. Wenn Sie Informationen zu einem Streckenabschnitt analysieren möchten, müssen Sie diese vom Navigationssystem abrufen, bevor Sie continueToNextDestination()
aufrufen.
Das folgende Codebeispiel zeigt eine Methode zum Bearbeiten des didArriveAtWaypoint
-Ereignisses:
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; }
Aktualisierungen zu Routenänderungen erhalten
Wenn Sie jedes Mal eine Benachrichtigung erhalten möchten, wenn sich die Route ändert, erstellen Sie eine Methode zum Bearbeiten des Ereignisses navigatorDidChangeRoute
. Sie können über die Attribute 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."); }
Aktualisierungen zur voraussichtlichen Ankunftszeit erhalten
Wenn Sie kontinuierliche Updates zur Zeit bis zum Ziel erhalten möchten, erstellen Sie eine Methode zum Bearbeiten des Ereignisses didUpdateRemainingTime
. Der Parameter time
gibt die geschätzte Zeit in Sekunden bis zum Erreichen des nächsten Ziels an.
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); }
Wenn Sie die minimale Änderung der geschätzten Zeit bis zum nächsten Ziel festlegen möchten, legen Sie die Eigenschaft timeUpdateThreshold
auf GMSNavigator
fest. Der Wert wird in Sekunden angegeben. Wenn diese Property nicht festgelegt ist, verwenden die Dienste den Standardwert „1 Sekunde“.
Swift
navigator?.timeUpdateThreshold = 10
Objective-C
navigator.timeUpdateThreshold = 10;
Aktualisierungen der Entfernung zum Ziel erhalten
Wenn Sie kontinuierliche Aktualisierungen der Entfernung zum Ziel erhalten möchten, erstellen Sie eine Methode zum Bearbeiten 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]); }
Wenn Sie die minimale Änderung der geschätzten Entfernung zum nächsten Ziel festlegen möchten, legen Sie die Property distanceUpdateThreshold
auf GMSNavigator
fest. Der Wert wird in Metern angegeben. Wenn diese Eigenschaft nicht festgelegt ist, verwenden die Dienste den Standardwert „1 Meter“.
Swift
navigator?.distanceUpdateThreshold = 100
Objective-C
navigator.distanceUpdateThreshold = 100;
Verkehrsinformationen erhalten
Wenn Sie kontinuierliche Updates des Verkehrsflusses für die verbleibende Route erhalten möchten, erstellen Sie eine Methode zum Bearbeiten des didUpdateDelayCategory
-Ereignisses. Ein Aufruf von delayCategoryToNextDestination
gibt GMSNavigationDelayCategory
zurück, der einen Wert von 0 bis 3 liefert. Aktualisierungen der Kategorie basieren auf der aktuellen Position des App-Nutzers. Wenn keine Zugriffsdaten verfügbar sind, wird für GMSNavigationDelayCategory
der Wert 0 zurückgegeben. Die Zahlen 1–3 geben den zunehmenden Fluss von leicht nach 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 GMSNavigationDelayCategory
-Eigenschaft gibt die folgenden Verzögerungsstufen an:
Verzögerungskategorie | Beschreibung |
---|---|
GMSNavigationDelayCategoryNoData | 0 – Nicht verfügbar, keine Daten für den Traffic oder : |
der Route. | |
GMSNavigationDelayCategoryHeavy | 1 – Schwer. |
GMSNavigationDelayCategoryMedium | 2 – Mittel. |
GMSNavigationDelayCategoryLight | 3 – Leuchtend |
Geschwindigkeitswarnungen erhalten
Wenn Sie Updates erhalten möchten, wenn ein Fahrer das Tempolimit überschreitet, erstellen Sie eine Methode zum Bearbeiten 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 den geschätzten Änderungen der Beleuchtung erhalten möchten, erstellen Sie eine Methode zum Bearbeiten 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; }