В этом руководстве рассказывается, как настроить приложение, чтобы оно отслеживало различные события, происходящие во время движения пользователя по маршруту, и реагировало на них. В этом руководстве не рассматривается определение маршрута, а только реагирование на события на маршруте.
Обзор
Navigation SDK для iOS предоставляет слушателей, связанных с местоположением пользователя, условиями на маршруте и важными данными о времени и расстоянии. В контроллере представления карты приложение должно использовать протоколы для этих прослушивателей: GMSRoadSnappedLocationProviderListener и GMSNavigatorListener.
Ниже перечислены методы прослушивания, доступные для событий навигации.
GMSNavigatorListener.didArriveAtWaypoint– активируется, когда пользователь достигает пункта назначения.GMSNavigatorListener.navigatorDidChangeRoute– активируется при изменении маршрута.GMSNavigatorListener.didUpdateRemainingTime, вызывается повторно по мере изменения времени до следующего пункта назначения, пока активно ведение по маршруту.GMSNavigatorListener.didUpdateRemainingDistance, вызывается повторно по мере изменения расстояния до следующего пункта назначения, пока активно ведение по маршруту.GMSNavigatorListener.didUpdateDelayCategoryвызывается, когда меняется категория задержки до следующего пункта назначения при активном ведении по маршруту.GMSNavigatorListener.didChangeSuggestedLightingMode– срабатывает, когда обновляются расчетные условия освещения. Например, когда в текущем местоположении пользователя наступает ночь, освещение меняется.GMSNavigatorListener.didUpdateSpeedingPercentage– срабатывает, когда водитель превышает ограничение скорости.GMSRoadSnappedLocationProviderListener.didUpdateLocation, который вызывается повторно при изменении местоположения пользователя.
Посмотреть код
Объявление о соответствии требуемым протоколам
Прежде чем реализовывать методы навигации, контроллер представления должен принять протоколы:
Swift
class ViewController:
UIViewController,
GMSNavigatorListener,
GMSRoadSnappedLocationProviderListener
{
}
Objective-C
@interface ViewController () <GMSNavigatorListener, GMSRoadSnappedLocationProviderListener>
@end
После принятия протоколов навигации настройте прослушиватели для контроллера представления. Например, в метод viewDidLoad() можно добавить следующий код:
Swift
mapView.navigator?.add(self)
mapView.roadSnappedLocationProvider?.add(self)
Objective-C
[_mapView.navigator addListener:self];
[_mapView.roadSnappedLocationProvider addListener:self];
Как включить или отключить уведомления о местоположении
Чтобы показывать на карте перемещение пользователя, необходимо обновлять данные о его местоположении.
Экземпляр location предоставляет следующие свойства:
| Свойство Location | Описание |
|---|---|
| высота над уровнем моря | Текущая высота. |
| coordinate.latitude | Текущая координата широты с привязкой к дороге. |
| coordinate.longitude | Текущая координата долготы с привязкой к дороге. |
| курс | Текущий азимут в градусах. |
| скорость | Текущая скорость. |
| временная метка | Дата и время текущего измерения. |
Чтобы постоянно получать уведомления о местоположении, вызовите метод mapView.roadSnappedLocationProvider.startUpdatingLocation и используйте GMSRoadSnappedLocationProviderListener для обработки события didUpdateLocation.
Пример вызова startUpdatingLocation:
Swift
mapView.roadSnappedLocationProvider.startUpdatingLocation()
Objective-C
[_mapView.roadSnappedLocationProvider startUpdatingLocation];
В следующем примере кода создается объект GMSRoadSnappedLocationProviderListener, который обрабатывает событие didUpdateLocation.
Swift
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:
Swift
mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = true
Objective-C
_mapView.roadSnappedLocationProvider.allowsBackgroundLocationUpdates = YES;
Обнаружение событий прибытия
Приложение использует событие didArriveAtWaypoint, чтобы определить, когда пользователь достиг пункта назначения. Вы можете возобновить навигацию и перейти к следующей путевой точке, вызвав continueToNextDestinationWithCompletion() и снова включив навигацию. Приложение должно повторно включить подсказки после вызова continueToNextDestinationWithCompletion().
После вызова continueToNextDestinationWithCompletion у навигатора больше не будет данных о предыдущем пункте назначения. Если вы хотите проанализировать информацию об участке маршрута, вы должны получить ее из навигатора до вызова continueToNextDestinationWithCompletion().
В примере ниже показан метод обработки события didArriveAtWaypoint:
Swift
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.
Swift
func navigatorDidChangeRoute(_ navigator: GMSNavigator) {
print("The route has changed.")
}
Objective-C
- (void)navigatorDidChangeRoute:(GMSNavigator *)navigator {
NSLog(@"The route has changed.");
}
Получение обновлений о времени прибытия в пункт назначения
Чтобы постоянно получать информацию о времени до пункта назначения, создайте метод для обработки события didUpdateRemainingTime. Параметр time указывает расчетное время в секундах до прибытия в следующий пункт назначения.
Swift
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. Значение указывается в секундах. Если это свойство не задано, сервисы используют значение по умолчанию, равное одной секунде.
Swift
navigator?.timeUpdateThreshold = 10
Objective-C
navigator.timeUpdateThreshold = 10;
Получение информации о расстоянии до пункта назначения
Чтобы постоянно получать информацию о расстоянии до пункта назначения, создайте метод для обработки события didUpdateRemainingDistance. Параметр distance содержит расчетное расстояние до следующего пункта назначения в метрах.
Swift
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 (значение указывается в метрах). Если это свойство не задано, сервисы используют значение по умолчанию, равное одному метру.
Swift
navigator?.distanceUpdateThreshold = 100
Objective-C
navigator.distanceUpdateThreshold = 100;
Получение информации о дорожной обстановке
Чтобы постоянно получать обновления о дорожном движении на оставшейся части маршрута, создайте метод для обработки события didUpdateDelayCategory. Вызов delayCategoryToNextDestination возвращает GMSNavigationDelayCategory, который предоставляет значение от 0 до 3. Обновления категории основаны на текущем местоположении пользователя приложения. Если данные о трафике недоступны, GMSNavigationDelayCategory возвращает 0. Цифры от 1 до 3 указывают на увеличение объема выделений от скудных до обильных.
Swift
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.
Swift
// 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);
}
Изменение рекомендуемого режима освещения
GMSNavigator рассчитывает рекомендуемый режим освещения на основе времени суток и местоположения устройства и вызывает метод прослушивателя didChangeSuggestedLightingMode только при изменении рекомендуемого режима (например, на рассвете или закате). Чтобы при запуске приложения карта открывалась в подходящем режиме освещения, задайте для навигатора значение mapView.lightingMode в suggestedLightingMode во время инициализации и реализуйте didChangeSuggestedLightingMode для обработки последующих изменений.
В следующем примере показано, как задать начальный режим освещения и прослушивать рекомендуемые изменения режима освещения:
Swift
// Set the initial lighting mode on launch or setup.
mapView.lightingMode = mapView.navigator?.suggestedLightingMode ?? .normal
// 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
// Set the initial lighting mode on launch or setup.
_mapView.lightingMode = _mapView.navigator.suggestedLightingMode;
// 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;
}
Подробнее о настройке режимов освещения…