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:
GMSRoadSnappedLocationProviderListener
i GMSNavigatorListener
.
Ta lista zawiera metody listenera dostępne dla zdarzeń nawigacji:
GMSNavigatorListener.didArriveAtWaypoint
, wywoływany po dotarciu do miejsca docelowego.GMSNavigatorListener.navigatorDidChangeRoute
, aktywowane, gdy zmienia się trasa.GMSNavigatorListener.didUpdateRemainingTime
, wywoływany wielokrotnie, gdy zmienia się czas dojazdu do następnego celu, podczas gdy aktywne jest prowadzenie.GMSNavigatorListener.didUpdateRemainingDistance
, wywoływany wielokrotnie, gdy zmienia się odległość do następnego celu, podczas gdy aktywne jest prowadzenie.GMSNavigatorListener.didUpdateDelayCategory
, wywoływany, gdy zmienia się kategoria opóźnienia do następnego miejsca docelowego, gdy aktywne są wskazówki.GMSNavigatorListener.didChangeSuggestedLightingMode
, aktywowane, gdy aktualizowane są szacowane warunki oświetlenia. Na przykład: gdy zapada noc w obecnej lokalizacji użytkownika, zmienia się oświetlenie.GMSNavigatorListener.didUpdateSpeedingPercentage
, aktywowana, gdy kierowca przekracza limit prędkości.GMSRoadSnappedLocationProviderListener.didUpdateLocation
, wywoływany wielokrotnie w zależności od zmian lokalizacji użytkownika.
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 routeLegs
i currentRouteLeg
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; }