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 obejmuje definiowania trasy, a jedynie reagowanie 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 tych detektorów:
GMSRoadSnappedLocationProviderListener
i
GMSNavigatorListener.
Ta lista zawiera metody detektorów dostępne dla zdarzeń nawigacji:
GMSNavigatorListener.didArriveAtWaypoint– wywoływana po dotarciu do celu.GMSNavigatorListener.navigatorDidChangeRoute– wywoływana, gdy zmienia się trasa.GMSNavigatorListener.didUpdateRemainingTime– wywoływana wielokrotnie, gdy zmienia się czas dojazdu do następnego celu, a nawigacja jest aktywna.GMSNavigatorListener.didUpdateRemainingDistance– wywoływana wielokrotnie, gdy zmienia się odległość do następnego celu, a nawigacja jest aktywna.GMSNavigatorListener.didUpdateDelayCategory– wywoływana, gdy zmienia się kategoria opóźnienia do następnego celu, a nawigacja jest aktywna.GMSNavigatorListener.didChangeSuggestedLightingMode– wywoływana, gdy aktualizują się szacowane warunki oświetleniowe. Na przykład gdy w aktualnej lokalizacji użytkownika zapada zmrok, oświetlenie się zmienia.GMSNavigatorListener.didUpdateSpeedingPercentage– wywoływana, gdy kierowca przekracza dozwoloną prędkość.GMSRoadSnappedLocationProviderListener.didUpdateLocation– wywoływana wielokrotnie, gdy zmienia się lokalizacja użytkownika.
Wyświetlanie kodu
Deklarowanie zgodności z wymaganymi protokołami
Zanim zaimplementujesz metody nawigacji, kontroler widoku musi przyjąć te protokoły:
Swift
class ViewController:
UIViewController,
GMSNavigatorListener,
GMSRoadSnappedLocationProviderListener
{
}
Objective-C
@interface ViewController () <GMSNavigatorListener, GMSRoadSnappedLocationProviderListener>
@end
Po przyjęciu protokołów nawigacji ustaw detektory 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 lub zatrzymywanie aktualizacji lokalizacji
Aktualizacje 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 |
|---|---|
| altitude | Aktualna wysokość. |
| coordinate.latitude | Aktualna szerokość geograficzna. |
| coordinate.longitude | Aktualna długość geograficzna. |
| course | Aktualny kierunek w stopniach. |
| speed | Aktualna prędkość. |
| timestamp | Data i godzina bieżącego odczytu. |
Aby otrzymywać ciągłe aktualizacje lokalizacji, wywołaj mapView.roadSnappedLocationProvider.startUpdatingLocation i użyj GMSRoadSnappedLocationProviderListener do obsługi zdarzenia didUpdateLocation.
Ten przykład pokazuje wywołanie 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 na true:
Swift
mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = true
Objective-C
_mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = YES;
Wykrywanie zdarzeń przybycia
Aplikacja używa zdarzenia didArriveAtWaypoint do wykrywania, kiedy dotarto do celu. Możesz wznowić nawigację i przejść do następnego punktu trasy, wywołując continueToNextDestinationWithCompletion() i ponownie włączając nawigację. Aplikacja musi ponownie włączyć nawigację po wywołaniu continueToNextDestinationWithCompletion().
Gdy aplikacja wywoła continueToNextDestinationWithCompletion, nawigator nie będzie już mieć danych o poprzednim celu. Jeśli chcesz przeanalizować informacje o odcinku trasy, musisz pobrać je z nawigatora przed wywołaniem continueToNextDestinationWithCompletion().
Ten przykład kodu 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 aktualizacji dotyczących zmian 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 w GMSNavigator.
Swift
func navigatorDidChangeRoute(_ navigator: GMSNavigator) {
print("The route has changed.")
}
Objective-C
- (void)navigatorDidChangeRoute:(GMSNavigator *)navigator {
NSLog(@"The route has changed.");
}
Otrzymywanie aktualizacji dotyczących czasu dojazdu do celu
Aby otrzymywać ciągłe aktualizacje dotyczące czasu dojazdu do celu, utwórz metodę obsługi zdarzenia didUpdateRemainingTime. Parametr time zawiera szacowany czas w sekundach do dotarcia do następnego celu.
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 dojazdu do następnego celu, ustaw właściwość timeUpdateThreshold w GMSNavigator. Wartość podaje się w sekundach. Jeśli ta właściwość nie jest ustawiona, usługi używają wartości domyślnej 1 sekundy.
Swift
navigator?.timeUpdateThreshold = 10
Objective-C
navigator.timeUpdateThreshold = 10;
Otrzymywanie aktualizacji dotyczących odległości do celu
Aby otrzymywać ciągłe aktualizacje dotyczące odległości do celu, utwórz metodę obsługi zdarzenia didUpdateRemainingDistance. Parametr distance zawiera szacowaną odległość w metrach do następnego celu.
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 celu, ustaw właściwość distanceUpdateThreshold w GMSNavigator (wartość podaje się w metrach). Jeśli ta właściwość nie jest ustawiona, usługi używają wartości domyślnej 1 metra.
Swift
navigator?.distanceUpdateThreshold = 100
Objective-C
navigator.distanceUpdateThreshold = 100;
Otrzymywanie aktualizacji dotyczących ruchu drogowego
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 delayCategoryToNextDestination zwraca GMSNavigationDelayCategory, która przyjmuje wartość od 0 do 3. Aktualizacje kategorii są oparte na bieżącej pozycji użytkownika aplikacji. Jeśli dane o ruchu drogowym są niedostępne, GMSNavigationDelayCategory zwraca 0. Liczby od 1 do 3 wskazują na rosnące natężenie ruchu od lekkiego do dużego.
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 drogowym lub |
| trasie. | |
| GMSNavigationDelayCategoryHeavy | 1 – duże. |
| GMSNavigationDelayCategoryMedium | 2 – średnie. |
| GMSNavigationDelayCategoryLight | 3 – lekkie. |
Otrzymywanie aktualizacji dotyczących przekraczania prędkości
Aby otrzymywać aktualizacje, gdy kierowca przekracza 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);
}
Zmiana sugerowanego trybu oświetlenia
Aby otrzymywać aktualizacje dotyczące 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;
}