Используйте это руководство, чтобы ваше приложение могло отслеживать и реагировать на различные события, которые изменяются по мере перемещения пользователя по маршруту. В этом руководстве не рассматривается создание маршрута, а только реагирование на события на нём.
Обзор
 Navigation SDK для iOS предоставляет слушатели, связанные с местоположением пользователя и условиями на маршруте, а также важные данные о времени и расстоянии. В контроллере представления карты вашему приложению необходимо настроить протоколы для этих слушателей: GMSRoadSnappedLocationProviderListener и GMSNavigatorListener .
В этом списке показаны методы прослушивания, доступные для событий навигации:
-  
GMSNavigatorListener.didArriveAtWaypoint, срабатывает при достижении пункта назначения. -  
GMSNavigatorListener.navigatorDidChangeRoute, срабатывает при изменении маршрута. -  
GMSNavigatorListener.didUpdateRemainingTimeвызывается повторно по мере изменения времени до следующего пункта назначения, пока активны навигаторы. -  
GMSNavigatorListener.didUpdateRemainingDistanceвызывается повторно по мере изменения расстояния до следующего пункта назначения, пока активны навигаторы. -  
GMSNavigatorListener.didUpdateDelayCategoryвызывается при изменении категории задержки до следующего пункта назначения, пока активны указания. -  
GMSNavigatorListener.didChangeSuggestedLightingModeсрабатывает при обновлении предполагаемых условий освещения. Например, когда в текущем местоположении пользователя наступает ночь, освещение меняется. -  
GMSNavigatorListener.didUpdateSpeedingPercentageсрабатывает, когда водитель превышает ограничение скорости. -  
GMSRoadSnappedLocationProviderListener.didUpdateLocationвызывается повторно при изменении местоположения пользователя. 
Посмотреть код
Декларирование соответствия требуемым протоколам
Перед реализацией методов навигации контроллер представления должен принять протоколы:
Быстрый
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 предоставляет следующие уровни задержки:
| Категория задержки | Описание | 
|---|---|
| GMSNavigationDelayCategoryNoData | 0 — Недоступно, нет данных о трафике или: | 
| маршрут. | |
| GMSNavigationDelayCategoryHeavy | 1 - Тяжелый. | 
| GMSNavigationDelayCategoryMedium | 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; }