Wykrywaj zdarzenia nawigacji

Za pomocą tego przewodnika możesz skonfigurować aplikację tak, aby nasłuchiwała i reagowała na różne zdarzenia, które zmieniają się w miarę przemieszczania się użytkownika po trasie. Ten przewodnik nie obejmuje definiowania trasy, tylko reagowanie na zdarzenia na trasie.

Omówienie

Pakiet SDK Nawigacji na iOS udostępnia listenery 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 zastosować protokoły dla tych odbiorców: GMSRoadSnappedLocationProviderListenerGMSNavigatorListener.

Poniżej znajdziesz listę metod listenera dostępnych w przypadku zdarzeń nawigacji:

Wyświetlanie kodu

deklarowanie zgodności z wymaganymi protokołami;

Przed implementacją metod nawigacji kontroler widoku musi zastosować te protokoły:

Swift

class ViewController: UIViewController, GMSNavigatorListener,
GMSRoadSnappedLocationProviderListener {

Objective-C

@interface ViewController () <GMSNavigatorListener,
GMSRoadSnappedLocationProviderListener>

@end

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

Swift

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

Objective-C

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

Otrzymywanie i zatrzymywanie aktualizacji lokalizacji

Aktualizacje lokalizacji są wymagane, aby wyświetlać postępy użytkownika na mapie.

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

Właściwość lokalizacji Opis
wysokość Bieżąca wysokość.
coordinate.latitude Bieżąca współrzędna szerokości geograficznej wyznaczona na podstawie drogi.
coordinate.longitude Bieżąca współrzędna długości geograficznej na podstawie drogi.
szkolenie Bieżący kierunek w stopniach.
szybkość bieżąca prędkość;
sygnatura czasowa Data i godzina bieżącego odczytu.

Aby otrzymywać ciągłe aktualizacje lokalizacji, wywołaj funkcję mapView.roadSnappedLocationProvider.startUpdatingLocation i użyj funkcji GMSRoadSnappedLocationProviderListener do obsługi zdarzenia didUpdateLocation.

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

Swift

mapView.roadSnappedLocationProvider.startUpdatingLocation()

Objective-C

[_mapView.roadSnappedLocationProvider startUpdatingLocation];

Podany niżej kod tworzy element 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ć aktualizacje lokalizacji, gdy aplikacja działa w tle, ustaw wartość allowsBackgroundLocationUpdates na „PRAWDA”:

Swift

mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = true

Objective-C

 _mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = YES;

Wykrywanie zdarzeń przybycia

Aplikacja używa zdarzenia didArriveAtWaypoint, aby wykryć, kiedy osiągnięto miejsce docelowe. Możesz wznowić wskazówki i przejść do następnego punktu orientacyjnego, naciskając continueToNextDestination(), a następnie ponownie włączając wskazówki. Aplikacja musi ponownie włączyć wskazówki po wywołaniu funkcji continueToNextDestination().

Po wywołaniu przez aplikację funkcji continueToNextDestination nawigator nie ma już danych o poprzednim miejscu docelowym. Jeśli chcesz przeanalizować informacje o odcinku trasy, musisz je pobrać z nawigatora przed wywołaniem funkcji continueToNextDestination().

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

Otrzymywanie powiadomień o zmianach trasy

Aby otrzymywać powiadomienie o każdej zmianie trasy, utwórz metodę do obsługi zdarzenia navigatorDidChangeRoute. Możesz uzyskać dostęp do nowej trasy, używając właściwości routeLegscurrentRouteLeg usługi 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 dojazdu

Aby otrzymywać ciągłe aktualizacje czasu dojazdu do miejsca docelowego, utwórz metodę do obsługi zdarzenia didUpdateRemainingTime. Parametr time podaje szacowany czas w sekundach do osiągnięcia 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ści timeUpdateThreshold na GMSNavigator. Wartość jest podawana w sekundach. Jeśli ta właściwość nie jest ustawiona, usługi używają wartości domyślnej, czyli 1 sekundy.

Swift

navigator?.timeUpdateThreshold = 10

Objective-C

navigator.timeUpdateThreshold = 10;

Otrzymywanie informacji o odległości do celu

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

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ę szacowanej odległości do następnego miejsca docelowego, ustaw właściwość distanceUpdateThreshold na GMSNavigator (wartość jest podawana w metrach). Jeśli ta właściwość nie jest ustawiona, usługi używają domyślnej wartości 1 metr.

Swift

navigator?.distanceUpdateThreshold = 100

Objective-C

navigator.distanceUpdateThreshold = 100;

Otrzymywanie informacji o ruchu

Aby otrzymywać ciągłe informacje o przepływie ruchu na pozostałej trasie, utwórz metodę do obsługi zdarzenia didUpdateDelayCategory. Wywołanie delayCategoryToNextDestination zwraca GMSNavigationDelayCategory, które zawiera 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 0. Liczby od 1 do 3 wskazują na zwiększający się natężony ruch od lekkiego do intensywnego.

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 :
trasy.
GMSNavigationDelayCategoryHeavy 1 – Ciężkie.
GMSNavigationDelayCategoryMedium 2 – Średnia.
GMSNavigationDelayCategoryLight 3 – światło.

Otrzymywanie powiadomień o przekroczeniu prędkości

Aby otrzymywać informacje o przekroczeniu przez kierowcę limitu prędkości, utwórz metodę do 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

Aby otrzymywać informacje o szacowanych zmianach oświetlenia, utwórz metodę do obsługi zdarzenia 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; }