Как отслеживать события навигации

В этом руководстве рассказывается, как настроить приложение, чтобы оно отслеживало различные события, происходящие во время движения пользователя по маршруту, и реагировало на них. В этом руководстве не рассматривается определение маршрута, а только реагирование на события на маршруте.

Обзор

Navigation SDK для iOS предоставляет слушателей, связанных с местоположением пользователя, условиями на маршруте и важными данными о времени и расстоянии. В контроллере представления карты приложение должно использовать протоколы для этих прослушивателей: GMSRoadSnappedLocationProviderListener и GMSNavigatorListener.

Ниже перечислены методы прослушивания, доступные для событий навигации.

Посмотреть код

Объявление о соответствии требуемым протоколам

Прежде чем реализовывать методы навигации, контроллер представления должен принять протоколы:

Swift

class ViewController:
  UIViewController,
  GMSNavigatorListener,
  GMSRoadSnappedLocationProviderListener
{
}

Objective-C

@interface ViewController () <GMSNavigatorListener, GMSRoadSnappedLocationProviderListener>
@end

После принятия протоколов навигации настройте прослушиватели для контроллера представления. Например, в метод viewDidLoad() можно добавить следующий код:

Swift

mapView.navigator?.add(self)
mapView.roadSnappedLocationProvider?.add(self)

Objective-C

[_mapView.navigator addListener:self];
[_mapView.roadSnappedLocationProvider addListener:self];

Как включить или отключить уведомления о местоположении

Чтобы показывать на карте перемещение пользователя, необходимо обновлять данные о его местоположении.

Экземпляр location предоставляет следующие свойства:

Свойство Location Описание
высота над уровнем моря Текущая высота.
coordinate.latitude Текущая координата широты с привязкой к дороге.
coordinate.longitude Текущая координата долготы с привязкой к дороге.
курс Текущий азимут в градусах.
скорость Текущая скорость.
временная метка Дата и время текущего измерения.

Чтобы постоянно получать уведомления о местоположении, вызовите метод mapView.roadSnappedLocationProvider.startUpdatingLocation и используйте GMSRoadSnappedLocationProviderListener для обработки события didUpdateLocation.

Пример вызова startUpdatingLocation:

Swift

mapView.roadSnappedLocationProvider.startUpdatingLocation()

Objective-C

[_mapView.roadSnappedLocationProvider startUpdatingLocation];

В следующем примере кода создается объект GMSRoadSnappedLocationProviderListener, который обрабатывает событие 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);
}

Чтобы получать уведомления о местоположении, когда приложение работает в фоновом режиме, задайте для allowsBackgroundLocationUpdates значение true:

Swift

mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = true

Objective-C

 _mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = YES;

Обнаружение событий прибытия

Приложение использует событие didArriveAtWaypoint, чтобы определить, когда пользователь достиг пункта назначения. Вы можете возобновить навигацию и перейти к следующей путевой точке, вызвав continueToNextDestinationWithCompletion() и снова включив навигацию. Приложение должно повторно включить подсказки после вызова continueToNextDestinationWithCompletion().

После вызова continueToNextDestinationWithCompletion у навигатора больше не будет данных о предыдущем пункте назначения. Если вы хотите проанализировать информацию об участке маршрута, вы должны получить ее из навигатора до вызова continueToNextDestinationWithCompletion().

В примере ниже показан метод обработки события 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;
}

Получение уведомлений об изменении маршрута

Чтобы получать уведомления об изменении маршрута, создайте метод для обработки события navigatorDidChangeRoute. Доступ к новому маршруту можно получить с помощью свойств routeLegs и currentRouteLeg объекта GMSNavigator.

Swift

func navigatorDidChangeRoute(_ navigator: GMSNavigator) {
  print("The route has changed.")
}

Objective-C

- (void)navigatorDidChangeRoute:(GMSNavigator *)navigator {
  NSLog(@"The route has changed.");
}

Получение обновлений о времени прибытия в пункт назначения

Чтобы постоянно получать информацию о времени до пункта назначения, создайте метод для обработки события didUpdateRemainingTime. Параметр time указывает расчетное время в секундах до прибытия в следующий пункт назначения.

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);
}

Чтобы задать минимальное изменение расчетного времени до следующего пункта назначения, установите свойство timeUpdateThreshold для GMSNavigator. Значение указывается в секундах. Если это свойство не задано, сервисы используют значение по умолчанию, равное одной секунде.

Swift

navigator?.timeUpdateThreshold = 10

Objective-C

navigator.timeUpdateThreshold = 10;

Получение информации о расстоянии до пункта назначения

Чтобы постоянно получать информацию о расстоянии до пункта назначения, создайте метод для обработки события didUpdateRemainingDistance. Параметр distance содержит расчетное расстояние до следующего пункта назначения в метрах.

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]);
}

Чтобы задать минимальное изменение расчетного расстояния до следующего пункта назначения, установите свойство distanceUpdateThreshold для GMSNavigator (значение указывается в метрах). Если это свойство не задано, сервисы используют значение по умолчанию, равное одному метру.

Swift

navigator?.distanceUpdateThreshold = 100

Objective-C

navigator.distanceUpdateThreshold = 100;

Получение информации о дорожной обстановке

Чтобы постоянно получать обновления о дорожном движении на оставшейся части маршрута, создайте метод для обработки события didUpdateDelayCategory. Вызов delayCategoryToNextDestination возвращает GMSNavigationDelayCategory, который предоставляет значение от 0 до 3. Обновления категории основаны на текущем местоположении пользователя приложения. Если данные о трафике недоступны, GMSNavigationDelayCategory возвращает 0. Цифры от 1 до 3 указывают на увеличение объема выделений от скудных до обильных.

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);
}

Свойство GMSNavigationDelayCategory поддерживает следующие уровни задержки:

Категория задержки Описание
GMSNavigationDelayCategoryNoData 0 – недоступно, нет данных о трафике или
маршрут.
GMSNavigationDelayCategoryHeavy 1 – сильный.
GMSNavigationDelayCategoryMedium 2 – средний.
GMSNavigationDelayCategoryLight 3 – легкая.

Получение уведомлений о превышении скорости

Чтобы получать уведомления о превышении скорости, создайте метод для обработки события 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);
}

Изменение рекомендуемого режима освещения

GMSNavigator рассчитывает рекомендуемый режим освещения на основе времени суток и местоположения устройства и вызывает метод прослушивателя didChangeSuggestedLightingMode только при изменении рекомендуемого режима (например, на рассвете или закате). Чтобы при запуске приложения карта открывалась в подходящем режиме освещения, задайте для навигатора значение mapView.lightingMode в suggestedLightingMode во время инициализации и реализуйте didChangeSuggestedLightingMode для обработки последующих изменений.

В следующем примере показано, как задать начальный режим освещения и прослушивать рекомендуемые изменения режима освещения:

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;
}

Подробнее о настройке режимов освещения…