Z tego przewodnika dowiesz się, jak umożliwić aplikacji nasłuchiwanie różnych zdarzeń zmieniających się w miarę przemieszczania się użytkownika po trasie i reagowanie na nie. Ten przewodnik nie obejmuje wyznaczania trasy, a jedynie reagowanie na zdarzenia na trasie.
Przegląd
Pakiet Navigation SDK na iOS udostępnia słuchaczy
powiązanych 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 tych odbiorników:GMSRoadSnappedLocationProviderListener
i GMSNavigatorListener
.
Na tej liście znajdziesz metody detektora dostępne w przypadku zdarzeń nawigacji:
GMSNavigatorListener.didArriveAtWaypoint
, wywoływane po dotarciu do miejsca docelowego.GMSNavigatorListener.navigatorDidChangeRoute
, wywoływane, gdy zmienia się trasa.GMSNavigatorListener.didUpdateRemainingTime
, wywoływana wielokrotnie, gdy zmienia się czas dotarcia do następnego miejsca docelowego, podczas gdy wskazówki są aktywne.GMSNavigatorListener.didUpdateRemainingDistance
, wywoływana wielokrotnie, gdy zmienia się odległość do następnego miejsca docelowego, podczas gdy wskazówki są aktywne.GMSNavigatorListener.didUpdateDelayCategory
, wywoływana, gdy zmienia się kategoria opóźnienia do następnego miejsca docelowego, gdy wskazówki są aktywne.GMSNavigatorListener.didChangeSuggestedLightingMode
– aktywowane, gdy zaktualizowane zostaną szacowane warunki oświetleniowe. Na przykład gdy w obecnej lokalizacji użytkownika zapada noc, oświetlenie się zmienia.GMSNavigatorListener.didUpdateSpeedingPercentage
, gdy kierowca przekracza ograniczenie prędkości.GMSRoadSnappedLocationProviderListener.didUpdateLocation
, wywoływana wielokrotnie w miarę zmiany lokalizacji użytkownika.
Wyświetlanie kodu
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 odbiorniki w 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 wyłączanie 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ść, | Aktualna wysokość. |
coordinate.latitude | Aktualna szerokość geograficzna po dopasowaniu do drogi. |
coordinate.longitude | Aktualna współrzędna długości geograficznej po dopasowaniu do drogi. |
kurs | Obecny kierunek w stopniach. |
szybkość | obecną szybkość, |
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];
Poniższy 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
do wykrywania, kiedy użytkownik dotarł do miejsca docelowego. Możesz wznowić wskazówki i przejść do następnego punktu trasy, dzwoniąc pod numer 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 pobrać je 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ć powiadomienia o każdej zmianie trasy, utwórz metodę obsługi zdarzenia navigatorDidChangeRoute
. Dostęp do nowej ścieżki 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 miejsca docelowego
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 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 dotarcia do następnego miejsca docelowego, ustaw właściwość timeUpdateThreshold
w obiekcie GMSNavigator
. Wartość jest podawana w sekundach. Jeśli ta właściwość nie jest ustawiona, usługi używają domyślnej wartości 1 sekundy.
Swift
navigator?.timeUpdateThreshold = 10
Objective-C
navigator.timeUpdateThreshold = 10;
Otrzymywanie aktualizacji odległości od celu
Aby otrzymywać ciągłe aktualizacje odległości od miejsca docelowego, utwórz metodę obsługi zdarzenia didUpdateRemainingDistance
. Parametr distance
podaje szacowaną 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 obiekcie GMSNavigator
(wartość jest podawana w metrach). Jeśli ta właściwość nie jest ustawiona, usługi używają domyślnej wartości 1 metra.
Swift
navigator?.distanceUpdateThreshold = 100
Objective-C
navigator.distanceUpdateThreshold = 100;
Otrzymywanie informacji o ruchu
Aby otrzymywać ciągłe aktualizacje dotyczące natężenia ruchu na pozostałej części trasy, utwórz metodę obsługi zdarzenia didUpdateDelayCategory
. Wywołanie funkcji delayCategoryToNextDestination
zwraca wartość GMSNavigationDelayCategory
, która zawiera liczbę z zakresu 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 1–3 oznaczają rosnący przepływ 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 |
trasę. | |
GMSNavigationDelayCategoryHeavy | 1 – Intensywny. |
GMSNavigationDelayCategoryMedium | 2 – średni. |
GMSNavigationDelayCategoryLight | 3 – jasny. |
Otrzymywanie aktualizacji dotyczących przekroczenia prędkości
Aby otrzymywać aktualizacje, gdy kierowca przekracza ograniczenie prędkości, 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); }
Zmiana sugerowanego trybu oświetlenia
Aby otrzymywać aktualizacje szacowanych zmian oświetlenia, utwórz metodę 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; }