Как проложить маршрут

В этом руководстве рассказывается, как с помощью Navigation SDK для iOS построить в приложении маршрут до одного пункта назначения.

Обзор

  1. Интегрируйте Navigation SDK в свое приложение, как описано в разделе Настройка проекта.
  2. Настройте GMSMapView.
  3. Попросите пользователя принять условия использования и разрешить доступ к геолокации и фоновым уведомлениям.
  4. Создайте массив, содержащий один или несколько пунктов назначения.
  5. Определите GMSNavigator, чтобы управлять пошаговой навигацией.

    • Добавьте целевые страницы с помощью setDestinations.
    • Чтобы запустить навигацию, задайте для параметра isGuidanceActive значение true.
    • Используйте simulateLocationsAlongExistingRoute, чтобы симулировать движение автомобиля по маршруту для тестирования, отладки и демонстрации приложения.

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

Запросите у пользователя необходимые разрешения.

Прежде чем использовать Navigation SDK, пользователь должен принять условия использования и разрешить использование сервисов геолокации, необходимых для навигации. Если приложение будет работать в фоновом режиме, оно также должно запрашивать у пользователя разрешение на показ уведомлений с подсказками. В этом разделе показано, как отображать необходимые запросы на авторизацию.

Разрешите доступ к службам геолокации

Navigation SDK использует сервисы геолокации, для которых требуется разрешение пользователя. Чтобы включить геолокацию и показать диалоговое окно авторизации, выполните следующие действия:

  1. Включите возможности определения местоположения и фонового режима в Xcode:

    1. Откройте цель в Xcode и выберите вкладку Signing & Capabilities (Подпись и возможности). Подробную информацию можно найти в руководстве Apple по добавлению возможностей в приложение.
    2. Добавьте разрешения Location (Always) (Геолокация (всегда)) и Location (When In Use) (Геолокация (при использовании)). В текстовом поле для каждого языка кратко объясните, зачем приложению нужен доступ к сервисам геолокации. Например: "Приложению требуется разрешение на использование сервисов геолокации для пошаговой навигации".
    3. Добавьте функцию Background Modes (Фоновые режимы) и установите флажок Location updates (Обновления местоположения). Без этого разрешения приложение будет аварийно завершать работу при запуске навигации. Подробную информацию вы найдете в руководстве Apple по обработке обновлений местоположения в фоновом режиме.
  2. Чтобы показать диалоговое окно авторизации, вызовите метод requestAlwaysAuthorization() экземпляра менеджера местоположений.

Swift

self.locationManager.requestAlwaysAuthorization()

Objective-C

[_locationManager requestAlwaysAuthorization];

Полная документация Apple по авторизации сервисов геолокации

Разрешить уведомления для фоновых подсказок

Чтобы показывать уведомления, когда приложение работает в фоновом режиме, Navigation SDK требуется разрешение пользователя. Добавьте следующий код, чтобы запрашивать у пользователя разрешение на показ уведомлений:

Swift

UNUserNotificationCenter.current().requestAuthorization(options: [.alert]) {
  granted, error in
    // Handle denied authorization to display notifications.
    if !granted || error != nil {
      print("User rejected request to display notifications.")
    }
}

Objective-C

// Request authorization for alert notifications.
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
UNAuthorizationOptions options = UNAuthorizationOptionAlert;
[center requestAuthorizationWithOptions:options
                      completionHandler:
 ^(
   BOOL granted,
   NSError *_Nullable error) {
     if (!error && granted) {
       NSLog(@"iOS Notification Permission: newly Granted");
     } else {
       NSLog(@"iOS Notification Permission: Failed or Denied");
     }
   }];

Авторизовать датчики движения

В одном из следующих основных выпусков Navigation SDK для iOS будет объединять основные данные о местоположении с данными датчиков движения устройства (CMAltimeter), чтобы рассчитывать высоту маршрута. Когда SDK обращается к высотомеру, iOS автоматически использует эту строку, чтобы запросить у пользователя разрешение.

Добавление этого ключа сейчас не повлияет на текущее поведение, но предотвратит сбои инициализации при последующем обновлении SDK.

Чтобы подготовиться к будущим обновлениям SDK, настройте разрешения для датчика движения следующим образом:

  1. Откройте целевой объект в Xcode и перейдите на вкладку Info (Информация) или откройте файл Info.plist.

  2. Добавьте новый ключ: Privacy - Motion Usage Description (NSMotionUsageDescription).

  3. Добавьте краткое пояснение для пользователя. Пример: "Приложению требуется доступ к датчику движения, чтобы рассчитывать высоту и точнее прокладывать маршруты на карте".

Примите Условия использования.

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

Swift

  let termsAndConditionsOptions = GMSNavigationTermsAndConditionsOptions(companyName: "Ride Sharing Co.")

  GMSNavigationServices.showTermsAndConditionsDialogIfNeeded(
    with: termsAndConditionsOptions) { termsAccepted in
    if termsAccepted {
      // Enable navigation if the user accepts the terms.
      self.mapView.isNavigationEnabled = true
      self.mapView.settings.compassButton = true

      // Request authorization to use location services.
      self.locationManager.requestAlwaysAuthorization()

      // Request authorization for alert notifications which deliver guidance instructions
      // in the background.
    UNUserNotificationCenter.current().requestAuthorization(options: [.alert]) {
      granted, error in
        // Handle rejection of notification authorization.
        if !granted || error != nil {
          print("Authorization to deliver notifications was rejected.")
        }
      }
    } else {
      // Handle rejection of terms and conditions.
    }
  }

Objective-C

GMSNavigationTermsAndConditionsOptions *termsAndConditionsOptions = [[GMSNavigationTermsAndConditionsOptions alloc] initWithCompanyName:@"Ride Sharing Co."];

[GMSNavigationServices
  showTermsAndConditionsDialogIfNeededWithOptions:termsAndConditionsOptions
  callback:^(BOOL termsAccepted) {
   if (termsAccepted) {
     // Enable navigation if the user accepts the terms.
     _mapView.navigationEnabled = YES;
     _mapView.settings.compassButton = YES;

     // Request authorization to use the current device location.
     [_locationManager requestAlwaysAuthorization];

     // Request authorization for alert notifications which deliver guidance instructions
     // in the background.
     UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
     UNAuthorizationOptions options = UNAuthorizationOptionAlert;
     [center requestAuthorizationWithOptions:options
                           completionHandler:
     ^(
       BOOL granted,
       NSError *_Nullable error) {
         if (!error && granted) {
           NSLog(@"iOS Notification Permission: newly Granted");
         } else {
           NSLog(@"iOS Notification Permission: Failed or Denied");
         }
       }];
   } else {
     // Handle rejection of the terms and conditions.
   }
 }];

Как создать маршрут и начать навигацию

Чтобы построить маршрут, вызовите метод setDestinations навигатора с массивом из одного или нескольких пунктов назначения GMSNavigationWaypoint. Если маршрут успешно рассчитан, он появится на карте. Чтобы начать навигацию по маршруту, задайте для isGuidanceActive значение true в обратном вызове.

В примере ниже выполняется следующее:

  • Создание нового маршрута с одним пунктом назначения.
  • Начало навигации.
  • Включение уведомлений о подсказках в фоновом режиме.
  • Симуляция поездки по маршруту (необязательно).
  • Установка режима камеры "Следовать" (необязательно).

Swift

func startNav() {
  var destinations = [GMSNavigationWaypoint]()
  destinations.append(GMSNavigationWaypoint.init(placeID: "ChIJnUYTpNASkFQR_gSty5kyoUk",
                                                 title: "PCC Natural Market")!)

  mapView.navigator?.setDestinations(destinations) { routeStatus in
    self.mapView.navigator?.isGuidanceActive = true
    self.mapView.locationSimulator?.simulateLocationsAlongExistingRoute()
    self.mapView.cameraMode = .following
  }
}

Objective-C

- (void)startNav {
  NSArray<GMSNavigationWaypoint *> *destinations =
  @[[[GMSNavigationWaypoint alloc] initWithPlaceID:@"ChIJnUYTpNASkFQR_gSty5kyoUk"
                                             title:@"PCC Natural Market"]];

  [_mapView.navigator setDestinations:destinations
                             callback:^(GMSRouteStatus routeStatus){
                               [_mapView.locationSimulator simulateLocationsAlongExistingRoute];
                               _mapView.navigator.guidanceActive = YES;
                               _mapView.cameraMode = GMSNavigationCameraModeFollowing;
                             }];
}

Подробнее об идентификаторах мест…

Сценарии с несколькими остановками

Вы можете настроить не более 25 путевых точек.

Метод setDestinations не поддерживает маршруты с несколькими остановками. Используйте continueToNextDestinationWithCompletion(), чтобы перейти к следующей путевой точке на пути.

Выбрать режим передвижения

Способ передвижения определяет тип маршрута, который нужно получить, и то, как определяется курс пользователя. Для маршрута можно задать один из четырех способов передвижения: на автомобиле, на велосипеде, пешком и на такси. В режиме вождения и такси курс пользователя определяется направлением движения, а в режиме велосипеда и пешехода – направлением, в котором ориентировано устройство (в горизонтальном режиме – к верхней части устройства).

Задайте свойство travelMode для представления карты, как показано в следующем примере:

Swift

self.mapView.travelMode = .cycling

Objective-C

_mapView.travelMode = GMSNavigationTravelModeCycling;

Как исключить определенные дороги

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

Swift

self.mapView.navigator?.avoidsTolls = true

Objective-C

_mapView.navigator.avoidsTolls = YES;

Как настроить громкость голосовых подсказок

Чтобы настроить громкость голосовых подсказок, задайте для свойства volumeLevel навигатора значение "Низкая", "Средняя" или "Высокая". Навигатор использует последний сохраненный уровень громкости или по умолчанию устанавливает нормальный.

Swift

self.mapView.navigator?.volumeLevel = .low

Objective-C

_mapView.navigator.volumeLevel = GMSNavigationVolumeLevelLow;

Поиск по идентификатору места

Чтобы найти идентификаторы мест, которые можно использовать в качестве пунктов назначения, воспользуйтесь инструментом поиска идентификаторов мест. Добавьте пункт назначения из placeID с помощью GMSNavigationWaypoint.

Плавающий текст

Вы можете добавить плавающий текст в любом месте приложения, если он не закрывает атрибуцию Google. Navigation SDK не поддерживает привязку текста к определенным координатам (широте, долготе) на карте или к ярлыку. Подробнее об информационных окнах…