Используйте это руководство, чтобы ваше приложение могло прослушивать и реагировать на различные события, которые меняются по мере того, как пользователь перемещается по маршруту. Это руководство не охватывает определение маршрута, а только реагирование на события по маршруту.
Обзор
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
предоставляет следующие уровни задержки:
Категория задержки | Описание |
---|---|
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; }