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:
GMSNavigatorListener.didArriveAtWaypoint
, uruchamiany po osiągnięciu miejsca docelowego.GMSNavigatorListener.navigatorDidChangeRoute
, uruchamiany przy zmianie trasy.GMSNavigatorListener.didUpdateRemainingTime
, może być wielokrotnie wywoływany, gdy zmienia się czas do następnego miejsca docelowego, podczas gdy są włączone wskazówki.GMSNavigatorListener.didUpdateRemainingDistance
, jest wywoływane wielokrotnie, gdy zmienia się odległość do następnego miejsca docelowego, natomiast są włączone wskazówki.GMSNavigatorListener.didUpdateDelayCategory
, wywoływana, gdy zmieni się kategoria opóźnienia do następnego miejsca docelowego, podczas gdy są włączone wskazówki.GMSNavigatorListener.didChangeSuggestedLightingMode
, uruchamiany po zaktualizowaniu szacowanych warunków oświetleniowych. Przykład: gdy w bieżącej lokalizacji użytkownika zapada noc, oświetlenie się zmienia.GMSNavigatorListener.didUpdateSpeedingPercentage
, uruchamiany, gdy kierowca przekracza dozwoloną prędkość.GMSRoadSnappedLocationProviderListener.didUpdateLocation
, jest wywoływane wielokrotnie w miarę zmiany lokalizacji użytkownika.
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; }