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.

Ta lista zawiera metody listenera dostępne dla zdarzeń nawigacji:

Wyświetlanie kodu

deklarowanie zgodności z wymaganymi protokołami;

Przed wdrożeniem 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 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 „true”:

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) dojazdu 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ś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 miejsca docelowego

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