Wykrywaj zdarzenia nawigacji

Z tego przewodnika dowiesz się, jak umożliwić aplikacji odsłuchiwanie różnych zdarzeń i reagowanie na nie które zmieniają się w miarę pokonywania trasy przez użytkownika. W tym przewodniku nie są: podczas ustalania trasy i reagowania tylko na zdarzenia na trasie.

Omówienie

Pakiet Navigation SDK na iOS udostępnia detektory związane z lokalizacją użytkownika i warunkami na trasie, ważne dane o czasie i dystansie. Na kontrolerze widoku mapy aplikacja musi zastosować protokoły w przypadku tych detektorów: GMSRoadSnappedLocationProviderListener oraz GMSNavigatorListener

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

Zobacz kod

Deklarowanie zgodności z wymaganymi protokołami

Przed zaimplementowaniem metod nawigacji kontroler widoków musi zastosować protokoły:

Swift

class ViewController: UIViewController, GMSNavigatorListener,
GMSRoadSnappedLocationProviderListener {

Objective-C

@interface ViewController () <GMSNavigatorListener,
GMSRoadSnappedLocationProviderListener>

@end

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

Swift

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

Objective-C

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

Otrzymywanie i zatrzymywanie aktualizacji lokalizacji

Aby pokazać na mapie postępy użytkownika, wymagana jest aktualizacja lokalizacji.

Instancja location ujawnia te właściwości:

Usługa lokalizacji Opis
wysokość Aktualna wysokość.
coordinate.latitude Obecna współrzędna szerokości geograficznej ograniczona do drogi.
coordinate.longitude Aktualna współrzędna długości geograficznej przypiętej drogi.
szkolenie Aktualne położenie w stopniach.
szybkość Obecna prędkość.
sygnatura czasowa Data/godzina bieżącego odczytu.

Aby otrzymywać ciągłe aktualizacje lokalizacji, zadzwoń pod numer mapView.roadSnappedLocationProvider.startUpdatingLocation i użyj funkcji GMSRoadSnappedLocationProviderListener do obsługi didUpdateLocation .

Ten przykład pokazuje wywołanie funkcji startUpdatingLocation:

Swift

mapView.roadSnappedLocationProvider.startUpdatingLocation()

Objective-C

[_mapView.roadSnappedLocationProvider startUpdatingLocation];

Ten kod tworzy 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 allowsBackgroundLocationUpdates zmieni wartość na prawda:

Swift

mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = true

Objective-C

 _mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = YES;

Wykrywam przyjazd

Aplikacja używa zdarzenia didArriveAtWaypoint do wykrywania, czy miejsce docelowe ma osiągnięto cel. Aby wznowić nawigowanie i przejść do następnego punktu pośredniego, należy zadzwonić pod numer continueToNextDestination(), a następnie ponownie włączyć wskazówki. Twoja aplikacja musi ponownie włączyć wskazówki po wywołaniu funkcji continueToNextDestination().

Gdy aplikacja wywoła funkcję continueToNextDestination, nawigacja nie będzie już dane o poprzednim miejscu docelowym. Jeśli chcesz przeanalizować informacje o etapu trasy, musisz pobrać te informacje z nawigatora przed nawiązaniem połączenia continueToNextDestination()

Następujący przykładowy kod pokazuje metodę obsługi: didArriveAtWaypoint zdarzenie:

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ć powiadomienia po każdej zmianie trasy, utwórz metodę obsługuje zdarzenie navigatorDidChangeRoute. Na nową trasę możesz wejść przez za pomocą właściwości routeLegs i currentRouteLeg właściwości GMSNavigator.

Swift

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

Objective-C

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

Aktualizacje dotyczące czasu odbioru do miejsca docelowego

Aby otrzymywać ciągłe aktualizacje czasu do miejsca docelowego, utwórz metodę obsługi didUpdateRemainingTime zdarzenie. Parametr time podaje szacunkową wartość 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ę w szacowanym czasie do następnego miejsca docelowego, ustaw wartość Usługa timeUpdateThreshold w dniu GMSNavigator. Wartość jest określona w argumencie sek. Jeśli ta właściwość nie jest skonfigurowana, usługi używają domyślnej wartości równej 1. sekunda.

Swift

navigator?.timeUpdateThreshold = 10

Objective-C

navigator.timeUpdateThreshold = 10;

Powiadomienia o odległości do miejsca docelowego

Aby otrzymywać ciągłe aktualizacje odległości do miejsca docelowego, utwórz metodę obsługi zdarzenie didUpdateRemainingDistance. Parametr distance udostępnia szacowana 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ę szacowanej odległości do następnego miejsca docelowego, ustaw Właściwość distanceUpdateThreshold w GMSNavigator (wartość jest określona w m). Jeśli ta właściwość nie jest skonfigurowana, usługi używają domyślnej wartości równej 1. m.

Swift

navigator?.distanceUpdateThreshold = 100

Objective-C

navigator.distanceUpdateThreshold = 100;

Odbieranie aktualizacji o ruchu

Aby otrzymywać bieżące informacje o natężeniu ruchu na pozostałej trasie, utworzysz metodę obsługi zdarzenia didUpdateDelayCategory. Wywołanie: delayCategoryToNextDestination zwraca wartość GMSNavigationDelayCategory, która podaje wartość od 0 do 3. Zmiany w kategorii są wprowadzane na podstawie bieżącej pozycji użytkownika aplikacji. Jeśli dane o ruchu są niedostępne, GMSNavigationDelayCategory zwraca wartość 0. Liczby 1–3 oznaczają wzrost zmienia się z płytkich na ciężkie.

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 ujawnia te poziomy opóźnień:

Kategoria opóźnienia Opis
GMSNavigationDelayCategoryNoData 0 – niedostępne, brak danych o ruchu lub :
trasę.
GMSNavigationDelayCategoryHeavy 1 – Intensywne.
GMSNavigationDelayCategoryMedium 2 – Średnia.
GMSNavigationDelayCategoryLight 3 – Lekkie.

Otrzymuję informacje o szybkości

Aby otrzymywać powiadomienia, gdy kierowca przekracza dozwoloną prędkość, 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); }

Zmiana sugerowanego trybu oświetlenia

Aby otrzymywać aktualizacje dotyczące szacunkowych zmian oświetlenia, utwórz metodę obsługi zdarzenie 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; }