Z tego przewodnika dowiesz się, jak umożliwić aplikacji nasłuchiwanie różnych zdarzeń, które zmieniają się, gdy użytkownik porusza się po trasie, i reagowanie na nie. Ten przewodnik nie dotyczy definiowania trasy, a jedynie reagowania na zdarzenia na trasie.
Przegląd
Pakiet Navigation SDK na iOS udostępnia detektory 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 przyjąć protokoły dla tych detektorów: GMSRoadSnappedLocationProviderListener i GMSNavigatorListener.
Ta lista zawiera metody detektorów dostępne w przypadku zdarzeń nawigacji:
GMSNavigatorListener.didArriveAtWaypoint, które jest aktywowane po dotarciu do miejsca docelowego.GMSNavigatorListener.navigatorDidChangeRoute, który jest aktywowany, gdy zmienia się trasa.GMSNavigatorListener.didUpdateRemainingTime, wywoływana wielokrotnie, gdy zmienia się czas do następnego miejsca docelowego, gdy wskazówki są aktywne.GMSNavigatorListener.didUpdateRemainingDistance, wywoływana wielokrotnie, gdy zmienia się odległość do następnego miejsca docelowego, gdy wskazówki są aktywne.GMSNavigatorListener.didUpdateDelayCategory, wywoływana, gdy kategoria opóźnienia do następnego miejsca docelowego zmienia się, gdy wskazówki są aktywne.GMSNavigatorListener.didChangeSuggestedLightingMode, wywoływane, gdy szacowane warunki oświetleniowe zostaną zaktualizowane. Na przykład gdy w bieżącej lokalizacji użytkownika zapada noc, oświetlenie się zmienia.GMSNavigatorListener.didUpdateSpeedingPercentage, które jest aktywowane, gdy kierowca przekracza ograniczenie prędkości.GMSRoadSnappedLocationProviderListener.didUpdateLocation, wywoływana wielokrotnie, gdy zmienia się lokalizacja użytkownika.
Wyświetl kod
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 detektory na 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 zatrzymywanie informacji o zmianie lokalizacji;
Informacje o zmianie lokalizacji są wymagane do wyświetlania postępów użytkownika na mapie.
Instancja location udostępnia te właściwości:
| Właściwość lokalizacji | Opis |
|---|---|
| wysokość | Bieżąca wysokość. |
| coordinate.latitude | Bieżąca szerokość geograficzna dopasowana do drogi. |
| coordinate.longitude | Bieżąca współrzędna długości geograficznej przyciągnięta do drogi. |
| kurs | Bieżący kierunek w stopniach. |
| prędkość | Obecna szybkość. |
| sygnatura czasowa | Data i godzina bieżącego odczytu. |
Aby otrzymywać ciągłe informacje o zmianie lokalizacji, wywołaj mapView.roadSnappedLocationProvider.startUpdatingLocation i użyj GMSRoadSnappedLocationProviderListener do obsługi zdarzenia didUpdateLocation.
Poniższy przykład pokazuje wywołanie startUpdatingLocation:
Swift
mapView.roadSnappedLocationProvider.startUpdatingLocation()
Objective-C
[_mapView.roadSnappedLocationProvider startUpdatingLocation];
Poniższy kod tworzy obiekt 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ć informacje o zmianie lokalizacji, gdy aplikacja działa w tle, ustaw allowsBackgroundLocationUpdates na wartość „true”:
Swift
mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = true
Objective-C
_mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = YES;
Wykrywanie zdarzeń przybycia
Aplikacja używa zdarzenia didArriveAtWaypoint, aby wykryć, kiedy użytkownik dotarł do miejsca docelowego. Możesz wznowić wskazówki i przejść do następnego punktu na trasie, wywołując funkcję continueToNextDestinationWithCompletion(), a następnie ponownie włączając wskazówki. Aplikacja musi ponownie włączyć wskazówki po wywołaniu continueToNextDestinationWithCompletion().
Gdy aplikacja wywoła funkcję continueToNextDestinationWithCompletion, nawigator nie będzie już mieć danych o poprzednim miejscu docelowym. Jeśli chcesz przeanalizować informacje o odcinku trasy, musisz je pobrać z nawigatora przed wywołaniem continueToNextDestinationWithCompletion().
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?.continueToNextDestinationWithCompletion { _, _ in }
mapView.navigator?.isGuidanceActive = true
}
Objective-C
- (void)navigator:(GMSNavigator *)navigator didArriveAtWaypoint:(GMSNavigationWaypoint *)waypoint {
NSLog(@"You have arrived at: %@", waypoint.title);
[_mapView.navigator continueToNextDestinationWithCompletion:^(GMSNavigationWaypoint *waypoint,
GMSRouteStatus status){
}];
_mapView.navigator.guidanceActive = YES;
}
Otrzymywanie informacji o zmianie trasy
Aby otrzymywać powiadomienia o każdej zmianie trasy, utwórz metodę obsługi zdarzenia navigatorDidChangeRoute. Dostęp do nowej trasy 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 celu,
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 dotarcia 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ść timeUpdateThreshold w GMSNavigator. Wartość jest podawana w sekundach. Jeśli ta właściwość nie jest skonfigurowana, usługi używają domyślnej wartości 1 sekundy.
Swift
navigator?.timeUpdateThreshold = 10
Objective-C
navigator.timeUpdateThreshold = 10;
otrzymywanie informacji o odległości do celu,
Aby otrzymywać ciągłe aktualizacje odległości do miejsca docelowego, utwórz metodę obsługi zdarzenia didUpdateRemainingDistance. Parametr distance podaje szacunkową 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ę szacunkowej odległości do następnego miejsca docelowego, ustaw właściwość distanceUpdateThreshold w GMSNavigator (wartość jest podawana w metrach). Jeśli ta właściwość nie jest skonfigurowana, usługi używają domyślnej wartości 1 metra.
Swift
navigator?.distanceUpdateThreshold = 100
Objective-C
navigator.distanceUpdateThreshold = 100;
Otrzymywanie informacji o natężeniu ruchu
Aby otrzymywać ciągłe aktualizacje natężenia ruchu na pozostałej części trasy, utwórz metodę obsługi zdarzenia didUpdateDelayCategory. Wywołanie delayCategoryToNextDestination zwraca GMSNavigationDelayCategory, co daje 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 wartość 0. Liczby od 1 do 3 oznaczają
coraz bardziej obfite krwawienie.
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 : |
| na trasie. | |
| GMSNavigationDelayCategoryHeavy | 1 – Duże. |
| GMSNavigationDelayCategoryMedium | 2 – średni. |
| GMSNavigationDelayCategoryLight | 3 – lekki. |
Otrzymywanie powiadomień o przekroczeniu prędkości
Aby otrzymywać aktualizacje, gdy kierowca przekroczy dozwoloną prędkość, 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);
}
Zmienianie sugerowanego trybu oświetlenia
GMSNavigator oblicza sugerowany tryb jasny na podstawie pory dnia i lokalizacji urządzenia, a następnie wywołuje metodę detektora didChangeSuggestedLightingMode tylko wtedy, gdy sugerowany tryb jasny się zmieni (np. o wschodzie lub zachodzie słońca). Aby mapa uruchamiała się z odpowiednim trybem jasnym, gdy użytkownik uruchamia aplikację, podczas inicjowania ustaw mapView.lightingMode na suggestedLightingMode nawigatora i zaimplementuj didChangeSuggestedLightingMode, aby obsługiwać kolejne zmiany.
Ten przykład pokazuje, jak ustawić początkowy tryb oświetlenia i nasłuchiwać sugerowanych zmian trybu oświetlenia:
Swift
// Set the initial lighting mode on launch or setup.
mapView.lightingMode = mapView.navigator?.suggestedLightingMode ?? .normal
// 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
// Set the initial lighting mode on launch or setup.
_mapView.lightingMode = _mapView.navigator.suggestedLightingMode;
// 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;
}
Więcej informacji o konfigurowaniu automatycznego i ręcznego trybu oświetlenia znajdziesz w artykule Konfigurowanie trybu normalnego i trybu słabego oświetlenia.