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

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

Обзор

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

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

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

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

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

Быстрый

class ViewController: UIViewController, GMSNavigatorListener,
GMSRoadSnappedLocationProviderListener {

Objective-C

@interface ViewController () <GMSNavigatorListener,
GMSRoadSnappedLocationProviderListener>

@end

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

Быстрый

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

Objective-C

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

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

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

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

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

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

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

Быстрый

mapView.roadSnappedLocationProvider.startUpdatingLocation()

Objective-C

[_mapView.roadSnappedLocationProvider startUpdatingLocation];

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

Быстрый

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:

Быстрый

mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = true

Objective-C

 _mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = YES;

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

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

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

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

Быстрый

func navigator(_ navigator: GMSNavigator, didArriveAt waypoint:
GMSNavigationWaypoint) { print("You have arrived at: \(waypoint.title)")
mapView.navigator?.continueToNextDestination()
mapView.navigator?.isGuidanceActive = true }

Objective-C

-   (void)navigator:(GMSNavigator *)navigator
    didArriveAtWaypoint:(GMSNavigationWaypoint *)waypoint { NSLog(@"You have
    arrived at: %@", waypoint.title); [_mapView.navigator
    continueToNextDestination]; _mapView.navigator.guidanceActive = YES; }

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

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

Быстрый

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

Objective-C

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

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

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

Быстрый

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 . Значение указывается в секундах. Если это свойство не задано, службы используют значение по умолчанию, равное одной секунде.

Быстрый

navigator?.timeUpdateThreshold = 10

Objective-C

navigator.timeUpdateThreshold = 10;

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

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

Быстрый

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 (значение указывается в метрах). Если это свойство не задано, службы используют значение по умолчанию в один метр.

Быстрый

navigator?.distanceUpdateThreshold = 100

Objective-C

navigator.distanceUpdateThreshold = 100;

Получение обновлений о дорожном движении

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

Быстрый

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 предоставляет следующие уровни задержки:

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

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

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

Быстрый

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

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

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

Быстрый

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