Слушайте навигационные события

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

Обзор

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

В этом списке показаны методы прослушивателя, доступные для событий навигации:

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

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

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

Быстрый

класс ViewController: UIViewController, GMSNavigatorListener, GMSRoadSnappedLocationProviderListener {

Цель-C

@interface ViewController ()

@конец

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

Быстрый

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

Цель-C

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

Получение или остановка обновлений местоположения

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

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

Местоположение объекта Описание
высота Текущая высота.
координата.широта Текущая координата широты, привязанная к дороге.
координата.долгота Текущая координата долготы, привязанная к дороге.
курс Текущий подшипник в градусах.
скорость Текущая скорость.
временная метка Дата/время текущего чтения.

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

В следующем примере показан вызов startUpdatingLocation :

Быстрый

mapView.roadSnappedLocationProvider.startUpdatingLocation()

Цель-C

[_mapView.roadSnappedLocationProvider startUpdatingLocation];

Следующий код создает GMSRoadSnappedLocationProviderListener , который обрабатывает событие didUpdateLocation .

Быстрый

func locationProvider(_ locationProvider: GMSRoadSnappedLocationProvider, DidUpdate location: CLLocation) { print("Location: (location.description)") }

Цель-C

  • (void)locationProvider:(GMSRoadSnappedLocationProvider *)locationProvider DidUpdateLocation:(CLLocation *)location { NSLog(@"Location: %@", location.description); }

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

Быстрый

mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = true

Цель-C

_mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = ДА;

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

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

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

В следующем примере кода показан метод обработки события didArriveAtWaypoint :

Быстрый

func navigator(_ navigator: GMSNavigator, DidArriveAt waypoint: GMSNavigationWaypoint) { print("Вы прибыли: (waypoint.title)") MapView.navigator?.continueToNextDestination() mapView.navigator?.isGuidanceActive = true }

Цель-C

  • (void)navigator:(GMSNavigator *)navigator DidArriveAtWaypoint:(GMSNavigationWaypoint *)waypoint { NSLog(@"Вы прибыли: %@", waypoint.title); [_mapView.navigator continueToNextDestination]; _mapView.navigator.guidanceActive = ДА; }

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

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

Быстрый

func navigatorDidChangeRoute(_ navigator: GMSNavigator) { print("Маршрут изменился.") }

Цель-C

  • (void)navigatorDidChangeRoute:(GMSNavigator *)navigator { NSLog(@"Маршрут изменился."); }

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

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

Быстрый

func navigator(_ navigator: GMSNavigator, DidUpdateRemainingTime time: TimeInterval) { print("Время до следующего пункта назначения: (время)") }

Цель-C

  • (void)navigator:(GMSNavigator *)navigator DidUpdateRemainingTime:(NSTimeInterval)time {NSLog(@"Время до следующего пункта назначения: %f", time); }

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

Быстрый

навигатор?.timeUpdateThreshold = 10

Цель-C

navigator.timeUpdateThreshold = 10;

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

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

Быстрый

func navigator(_ navigator: GMSNavigator, DidUpdateRemainingDistance distance: CLLocationDistance) { letmiles = distance * 0.00062137 print("Расстояние до следующего пункта назначения: (мили) миль.") }

Цель-C

  • (void) navigator: (GMSNavigator *) navigator DidUpdateRemainingDistance: (CLLocationDistance) расстояние {двойные мили = расстояние * 0,00062137; NSLog(@"%@", [NSString stringWithFormat:@"Расстояние до следующего пункта назначения: %.2f.", миль]); }

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

Быстрый

навигатор?.distanceUpdateThreshold = 100

Цель-C

navigator.distanceUpdateThreshold = 100;

Получение обновлений о пробках

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

Быстрый

func navigator(_ navigator: GMSNavigator, DidUpdatelayCategory: GMSNavigationDelayCategory) { print("Поток трафика к следующему пункту назначения: (delayCategory)") }

Цель-C

  • (void)navigator:(GMSNavigator *)navigator DidUpdateDelayCategory:(GMSNavigationDelayCategory)delayCategory {NSLog(@"Поток трафика к следующему пункту назначения: %ld", (long)delayCategory); }

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

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

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

Чтобы получать обновления, когда водитель превышает ограничение скорости, создайте метод для обработки события didUpdateSpeedingPercentage .

Быстрый

// Прослушиватель для обработки событий превышения скорости. func navigator( _ navigator: GMSNavigator, DidUpdateSpeedingPercentage процентAboveLimit: CGFloat ) { print("Скорость (percentageAboveLimit) превышает предел.") }

Цель-C

// Прослушиватель для обработки событий превышения скорости. - (void)navigator:(GMSNavigator *)navigator DidUpdateSpeedingPercentage:(CGFloat)percentageAboveLimit { NSLog(@"Скорость на %f процентов превышает предел.", процентAboveLimit); }

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

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

Быстрый

// Определить прослушиватель предлагаемых изменений режима освещения. func navigator(_ navigator: GMSNavigator, DidChangeSuggestedLightingMode LightingMode: GMSNavigationLightingMode) { print("Предлагаемый режим освещения изменился: (String(описание: LightingMode))")

// Вносим предложенное изменение. mapView.lightingMode = режим освещения }

Цель-C

// Определить прослушиватель предлагаемых изменений режима освещения. -(void)navigator:(GMSNavigator *)navigator DidChangeSuggestedLightingMode: (GMSNavigationLightingMode)lightingMode { NSLog(@"Предлагаемый режим освещения изменился: %ld", (long)lightingMode);

// Вносим предложенное изменение. _mapView.lightingMode = режим освещения; }