In diesem Leitfaden erfahren Sie, wie Sie Ihre App so konfigurieren, dass sie auf verschiedene Ereignisse reagiert, die sich ändern, wenn ein Nutzer eine Route entlangfährt. 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, die mit dem Standort des Nutzers und den Bedingungen entlang der Route sowie wichtigen Zeit- und Entfernungsdaten verknüpft sind. Im Ansichts-Controller der Karte muss Ihre App die Protokolle für diese Listener übernehmen: GMSRoadSnappedLocationProviderListener und GMSNavigatorListener.
In dieser Liste sind die Listener-Methoden 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 Zielführung aktiv ist.GMSNavigatorListener.didUpdateRemainingDistance, die wiederholt aufgerufen wird, wenn sich die Entfernung zum nächsten Ziel ändert, während die Zielführung aktiv ist.GMSNavigatorListener.didUpdateDelayCategory, wird aufgerufen, wenn sich die Verzögerungskategorie zum nächsten Ziel ändert, während die Routenführung aktiv ist.GMSNavigatorListener.didChangeSuggestedLightingMode, wird ausgelöst, wenn die geschätzten Lichtverhältnisse aktualisiert werden. Beispielsweise ändert sich die Beleuchtung, wenn es am aktuellen Standort des Nutzers dunkel wird.GMSNavigatorListener.didUpdateSpeedingPercentage, wird ausgelöst, wenn der Fahrer die Geschwindigkeitsbegrenzung überschreitet.GMSRoadSnappedLocationProviderListener.didUpdateLocation, die wiederholt aufgerufen wird, wenn sich der Standort des Nutzers ändert.
Code
Konformität mit den erforderlichen Protokollen deklarieren
Bevor Sie die Navigationsmethoden implementieren, müssen Sie die Protokolle im Ansichts-Controller ü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 Ansichts-Controller 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];
Standort-Updates 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 | Aktueller Breitengrad, der an die Straße angepasst wurde. |
| coordinate.longitude | Aktuelle Längengradkoordinate, die an die Straße angepasst wurde. |
| Kurs | Aktuelle Peilung in Grad. |
| speed | Aktuelle Geschwindigkeit. |
| timestamp | Datum/Uhrzeit des aktuellen Messwerts. |
Wenn Sie kontinuierliche Standort-Updates 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];
Mit dem folgenden Code wird ein GMSRoadSnappedLocationProviderListener erstellt, das 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 Standort-Updates 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 Zielführung fortsetzen und zum nächsten Wegpunkt wechseln, indem Sie continueToNextDestinationWithCompletion() aufrufen und die Zielführung dann wieder aktivieren. Ihre App muss die Zielführung nach dem Aufruf von continueToNextDestinationWithCompletion() wieder aktivieren.
Nachdem die App continueToNextDestinationWithCompletion aufgerufen hat, hat der Navigator keine Daten mehr zum vorherigen Ziel. Wenn Sie Informationen zu einem Routenabschnitt analysieren möchten, müssen Sie diese vor dem Aufruf von continueToNextDestinationWithCompletion() vom Navigator abrufen.
Der folgende Beispielcode zeigt eine Methode zur Verarbeitung des didArriveAtWaypoint-Ereignisses:
Swift
func navigator(_ navigator: GMSNavigator, didArriveAt waypoint: GMSNavigationWaypoint) {
print("You have arrived at: \(waypoint.title)")
mapView.navigator?.continueToNextDestinationWithCompletion { _, _ in }
mapView.navigator?.isGuidanceActive = true
}
Objective-C
- (void)navigator:(GMSNavigator *)navigator didArriveAtWaypoint:(GMSNavigationWaypoint *)waypoint {
NSLog(@"You have arrived at: %@", waypoint.title);
[_mapView.navigator continueToNextDestinationWithCompletion:^(GMSNavigationWaypoint *waypoint,
GMSRouteStatus status){
}];
_mapView.navigator.guidanceActive = YES;
}
Updates zu Routenänderungen erhalten
Wenn Sie jedes Mal benachrichtigt werden möchten, wenn die Route geändert wird, erstellen Sie eine Methode, um das Ereignis navigatorDidChangeRoute zu verarbeiten. Sie können auf die neue Route zugreifen, indem Sie die Attribute routeLegs und currentRouteLeg von GMSNavigator verwenden.
Swift
func navigatorDidChangeRoute(_ navigator: GMSNavigator) {
print("The route has changed.")
}
Objective-C
- (void)navigatorDidChangeRoute:(GMSNavigator *)navigator {
NSLog(@"The route has changed.");
}
Aktualisierungen zur Zeit bis zum Ziel erhalten
Wenn Sie kontinuierlich aktualisierte Informationen zur voraussichtlichen Ankunftszeit erhalten möchten, erstellen Sie eine Methode, um das Ereignis didUpdateRemainingTime zu verarbeiten. Der Parameter time gibt die geschätzte Zeit in Sekunden an, bis das nächste Ziel erreicht ist.
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 das Attribut timeUpdateThreshold für GMSNavigator fest. Der Wert wird in Sekunden angegeben. Wenn dieses Attribut nicht festgelegt ist, verwenden die Dienste den Standardwert von einer Sekunde.
Swift
navigator?.timeUpdateThreshold = 10
Objective-C
navigator.timeUpdateThreshold = 10;
Aktualisierungen zur Entfernung zum Ziel erhalten
Wenn Sie kontinuierlich Updates zur Entfernung zum Ziel erhalten möchten, erstellen Sie eine Methode zur Verarbeitung des didUpdateRemainingDistance-Ereignisses. 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 Mindeständerung der geschätzten Entfernung zum nächsten Ziel festlegen möchten, legen Sie das Attribut distanceUpdateThreshold für GMSNavigator fest (Wert wird in Metern angegeben). Wenn dieses Attribut 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, um das Ereignis didUpdateDelayCategory zu verarbeiten. Ein Aufruf von delayCategoryToNextDestination gibt GMSNavigationDelayCategory zurück, was einen Wert von 0 bis 3 liefert. Aktualisierungen der 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–3 geben die zunehmende Blutungsintensität 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);
}
Das Attribut GMSNavigationDelayCategory stellt die folgenden Verzögerungsstufen bereit:
| Verspätungskategorie | Beschreibung |
|---|---|
| GMSNavigationDelayCategoryNoData | 0 – Nicht verfügbar, keine Daten für Traffic oder : |
| die Route. | |
| GMSNavigationDelayCategoryHeavy | 1 – Stark. |
| GMSNavigationDelayCategoryMedium | 2 – Mittel. |
| GMSNavigationDelayCategoryLight | 3 – Leicht. |
Updates zu Geschwindigkeitsüberschreitungen erhalten
Wenn Sie Benachrichtigungen erhalten möchten, wenn ein Fahrer die Geschwindigkeitsbegrenzung überschreitet, erstellen Sie eine Methode zur Verarbeitung 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
GMSNavigator berechnet den vorgeschlagenen Beleuchtungsmodus anhand der Tageszeit und des Standorts des Geräts und ruft die Listener-Methode didChangeSuggestedLightingMode nur auf, wenn sich der vorgeschlagene Modus ändert (z. B. bei Sonnenaufgang oder Sonnenuntergang). Damit die Karte beim Starten der App im richtigen hellen Modus angezeigt wird, legen Sie bei der Initialisierung mapView.lightingMode auf suggestedLightingMode des Navigators fest und implementieren Sie didChangeSuggestedLightingMode, um nachfolgende Änderungen zu verarbeiten.
Im folgenden Beispiel wird gezeigt, wie Sie den anfänglichen Beleuchtungsmodus festlegen und auf vorgeschlagene Änderungen des Beleuchtungsmodus warten:
Swift
// Set the initial lighting mode on launch or setup.
mapView.lightingMode = mapView.navigator?.suggestedLightingMode ?? .normal
// 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
// Set the initial lighting mode on launch or setup.
_mapView.lightingMode = _mapView.navigator.suggestedLightingMode;
// 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;
}
Weitere Informationen zur automatischen und manuellen Konfiguration des Beleuchtungsmodus finden Sie unter Modus für normales und wenig Licht konfigurieren.