Это руководство поможет вашему приложению отслеживать и реагировать на различные события, изменяющиеся по мере перемещения пользователя по маршруту. В данном руководстве не рассматривается определение маршрута, а только реагирование на события, происходящие вдоль маршрута.
Обзор
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 для определения достижения пункта назначения. Вы можете возобновить навигацию и перейти к следующей путевой точке, вызвав метод continueToNextDestinationWithCompletion() , а затем снова включив навигацию. Ваше приложение должно повторно включить навигацию после вызова continueToNextDestinationWithCompletion() .
После вызова функции continueToNextDestinationWithCompletion приложением, навигатор больше не располагает данными о предыдущем пункте назначения. Если вы хотите проанализировать информацию об участке маршрута, необходимо получить её от навигатора до вызова continueToNextDestinationWithCompletion() .
В следующем примере кода показан метод для обработки события didArriveAtWaypoint :
Быстрый
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 .
Быстрый
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;
}