Wykrywaj zdarzenia nawigacji

Z tego przewodnika dowiesz się, jak umożliwić aplikacji nasłuchiwanie różnych zdarzeń, które zmieniają się, gdy użytkownik porusza się po trasie, i reagowanie na nie. Ten przewodnik nie dotyczy definiowania trasy, a jedynie reagowania na zdarzenia na trasie.

Przegląd

Pakiet Navigation SDK na iOS udostępnia detektory powiązane z lokalizacją użytkownika i warunkami na trasie oraz ważne dane o czasie i odległości. W kontrolerze widoku mapy aplikacja musi przyjąć protokoły dla tych detektorów: GMSRoadSnappedLocationProviderListener i GMSNavigatorListener.

Ta lista zawiera metody detektorów dostępne w przypadku zdarzeń nawigacji:

Wyświetl kod

Deklarowanie zgodności z wymaganymi protokołami

Przed wdrożeniem metod nawigacji kontroler widoku musi przyjąć protokoły:

Swift

class ViewController:
  UIViewController,
  GMSNavigatorListener,
  GMSRoadSnappedLocationProviderListener
{
}

Objective-C

@interface ViewController () <GMSNavigatorListener, GMSRoadSnappedLocationProviderListener>
@end

Po przyjęciu protokołów nawigacji ustaw detektory na kontrolerze widoku. Możesz na przykład dodać ten kod do metody viewDidLoad().

Swift

mapView.navigator?.add(self)
mapView.roadSnappedLocationProvider?.add(self)

Objective-C

[_mapView.navigator addListener:self];
[_mapView.roadSnappedLocationProvider addListener:self];

otrzymywanie i zatrzymywanie informacji o zmianie lokalizacji;

Informacje o zmianie lokalizacji są wymagane do wyświetlania postępów użytkownika na mapie.

Instancja location udostępnia te właściwości:

Właściwość lokalizacji Opis
wysokość Bieżąca wysokość.
coordinate.latitude Bieżąca szerokość geograficzna dopasowana do drogi.
coordinate.longitude Bieżąca współrzędna długości geograficznej przyciągnięta do drogi.
kurs Bieżący kierunek w stopniach.
prędkość Obecna szybkość.
sygnatura czasowa Data i godzina bieżącego odczytu.

Aby otrzymywać ciągłe informacje o zmianie lokalizacji, wywołaj mapView.roadSnappedLocationProvider.startUpdatingLocation i użyj GMSRoadSnappedLocationProviderListener do obsługi zdarzenia didUpdateLocation.

Poniższy przykład pokazuje wywołanie startUpdatingLocation:

Swift

mapView.roadSnappedLocationProvider.startUpdatingLocation()

Objective-C

[_mapView.roadSnappedLocationProvider startUpdatingLocation];

Poniższy kod tworzy obiekt GMSRoadSnappedLocationProviderListener, który obsługuje zdarzenie 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);
}

Aby otrzymywać informacje o zmianie lokalizacji, gdy aplikacja działa w tle, ustaw allowsBackgroundLocationUpdates na wartość „true”:

Swift

mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = true

Objective-C

 _mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = YES;

Wykrywanie zdarzeń przybycia

Aplikacja używa zdarzenia didArriveAtWaypoint, aby wykryć, kiedy użytkownik dotarł do miejsca docelowego. Możesz wznowić wskazówki i przejść do następnego punktu na trasie, wywołując funkcję continueToNextDestinationWithCompletion(), a następnie ponownie włączając wskazówki. Aplikacja musi ponownie włączyć wskazówki po wywołaniu continueToNextDestinationWithCompletion().

Gdy aplikacja wywoła funkcję continueToNextDestinationWithCompletion, nawigator nie będzie już mieć danych o poprzednim miejscu docelowym. Jeśli chcesz przeanalizować informacje o odcinku trasy, musisz je pobrać z nawigatora przed wywołaniem continueToNextDestinationWithCompletion().

Poniższy przykładowy kod pokazuje metodę obsługi zdarzenia didArriveAtWaypoint:

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

Otrzymywanie informacji o zmianie trasy

Aby otrzymywać powiadomienia o każdej zmianie trasy, utwórz metodę obsługi zdarzenia navigatorDidChangeRoute. Dostęp do nowej trasy możesz uzyskać za pomocą właściwości routeLegs i currentRouteLeg obiektu GMSNavigator.

Swift

func navigatorDidChangeRoute(_ navigator: GMSNavigator) {
  print("The route has changed.")
}

Objective-C

- (void)navigatorDidChangeRoute:(GMSNavigator *)navigator {
  NSLog(@"The route has changed.");
}

otrzymywanie aktualizacji czasu dotarcia do celu,

Aby otrzymywać ciągłe aktualizacje czasu dotarcia do miejsca docelowego, utwórz metodę obsługi zdarzenia didUpdateRemainingTime. Parametr time podaje szacowany czas w sekundach do dotarcia do następnego miejsca docelowego.

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

Aby ustawić minimalną zmianę szacowanego czasu do następnego miejsca docelowego, ustaw właściwość timeUpdateThreshold w GMSNavigator. Wartość jest podawana w sekundach. Jeśli ta właściwość nie jest skonfigurowana, usługi używają domyślnej wartości 1 sekundy.

Swift

navigator?.timeUpdateThreshold = 10

Objective-C

navigator.timeUpdateThreshold = 10;

otrzymywanie informacji o odległości do celu,

Aby otrzymywać ciągłe aktualizacje odległości do miejsca docelowego, utwórz metodę obsługi zdarzenia didUpdateRemainingDistance. Parametr distance podaje szacunkową odległość w metrach do następnego miejsca docelowego.

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

Aby ustawić minimalną zmianę szacunkowej odległości do następnego miejsca docelowego, ustaw właściwość distanceUpdateThreshold w GMSNavigator (wartość jest podawana w metrach). Jeśli ta właściwość nie jest skonfigurowana, usługi używają domyślnej wartości 1 metra.

Swift

navigator?.distanceUpdateThreshold = 100

Objective-C

navigator.distanceUpdateThreshold = 100;

Otrzymywanie informacji o natężeniu ruchu

Aby otrzymywać ciągłe aktualizacje natężenia ruchu na pozostałej części trasy, utwórz metodę obsługi zdarzenia didUpdateDelayCategory. Wywołanie delayCategoryToNextDestination zwraca GMSNavigationDelayCategory, co daje wartość od 0 do 3. Aktualizacje kategorii są oparte na bieżącej pozycji użytkownika aplikacji. Jeśli dane o ruchu są niedostępne, funkcja GMSNavigationDelayCategory zwraca wartość 0. Liczby od 1 do 3 oznaczają coraz bardziej obfite krwawienie.

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

Właściwość GMSNavigationDelayCategory udostępnia te poziomy opóźnienia:

Kategoria opóźnienia Opis
GMSNavigationDelayCategoryNoData 0 – niedostępne, brak danych o ruchu lub :
na trasie.
GMSNavigationDelayCategoryHeavy 1 – Duże.
GMSNavigationDelayCategoryMedium 2 – średni.
GMSNavigationDelayCategoryLight 3 – lekki.

Otrzymywanie powiadomień o przekroczeniu prędkości

Aby otrzymywać aktualizacje, gdy kierowca przekroczy dozwoloną prędkość, utwórz metodę obsługi zdarzenia 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);
}

Zmienianie sugerowanego trybu oświetlenia

GMSNavigator oblicza sugerowany tryb jasny na podstawie pory dnia i lokalizacji urządzenia, a następnie wywołuje metodę detektora didChangeSuggestedLightingMode tylko wtedy, gdy sugerowany tryb jasny się zmieni (np. o wschodzie lub zachodzie słońca). Aby mapa uruchamiała się z odpowiednim trybem jasnym, gdy użytkownik uruchamia aplikację, podczas inicjowania ustaw mapView.lightingMode na suggestedLightingMode nawigatora i zaimplementuj didChangeSuggestedLightingMode, aby obsługiwać kolejne zmiany.

Ten przykład pokazuje, jak ustawić początkowy tryb oświetlenia i nasłuchiwać sugerowanych zmian trybu oświetlenia:

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

Więcej informacji o konfigurowaniu automatycznego i ręcznego trybu oświetlenia znajdziesz w artykule Konfigurowanie trybu normalnego i trybu słabego oświetlenia.