Z tego przewodnika dowiesz się, jak umożliwić aplikacji nasłuchiwanie różnych zdarzeń i reagowanie na nie. Zdarzenia te zmieniają się w miarę przemieszczania się użytkownika po trasie. Ten przewodnik nie obejmuje wyznaczania trasy, a jedynie reagowanie na zdarzenia na trasie.
Przegląd
Pakiet Navigation SDK na iOS udostępnia odbiorniki
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 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, a wskazówki są aktywne.GMSNavigatorListener.didUpdateRemainingDistance, wywoływana wielokrotnie, gdy zmienia się odległość do następnego miejsca docelowego, podczas gdy aktywne są wskazówki.GMSNavigatorListener.didUpdateDelayCategory, wywoływana, gdy zmienia się kategoria opóźnienia do następnego miejsca docelowego, a wskazówki są aktywne.GMSNavigatorListener.didChangeSuggestedLightingMode, aktywowany, 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 limit 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 pokazywać 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. |
| prędkość | obecną szybkość, |
| sygnatura czasowa | 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.
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 continueToNextDestinationWithCompletion(), a następnie ponownie włączając wskazówki. Aplikacja musi ponownie włączyć wskazówki po wywołaniu
continueToNextDestinationWithCompletion().
Po wywołaniu przez aplikację funkcji continueToNextDestinationWithCompletion nawigator nie ma już danych o poprzednim miejscu docelowym. Jeśli chcesz analizować informacje o odcinku trasy, musisz pobrać je z nawigatora przed wywołaniem funkcji 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 powiadomień o zmianach 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 miejsca docelowego
Aby otrzymywać ciągłe aktualizacje czasu dojazdu 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ść podaje się 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 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ść 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 w obiekcie 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 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 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 zwraca wartość 0.GMSNavigationDelayCategory 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 – wysokie. |
| 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);
}
Zmienianie 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;
}