Navigationsereignisse im Blick behalten

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:

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; }