Выберите платформу: Android iOS

Как настроить оповещения о сбоях в реальном времени

Функции, связанные с дорожными происшествиями в реальном времени, позволяют пользователям узнавать о происшествиях на маршруте, а также сообщать о них и подтверждать их. Примеры помех: ДТП, пробки, посты полиции, камеры фиксации скорости, дорожные работы, перекрытие полос и определенные погодные условия. На этой странице рассказывается о функциях, связанных с дорожными происшествиями в реальном времени, и их настройке, в том числе в приложениях с собственным интерфейсом навигации.

Функции, связанные со сбоями в реальном времени

В Navigation SDK входят следующие функции, которые позволяют в реальном времени получать информацию о дорожных происшествиях:

Эти функции можно настраивать, и они включены по умолчанию. В разделах ниже приведена подробная информация о функциях и доступных параметрах конфигурации.

Интерактивные выноски с информацией о проблемах на маршрутах

Когда приложение показывает маршрут (в режиме обзора или во время навигации), все текущие проблемы отображаются в виде выносок на маршруте. Если включить слой "Пробки", на карте также будут показываться препятствия вне маршрута. В подсказках есть значок, указывающий на тип сбоя.

Уточнения на маршрутах

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

mapView.navigator.shouldDisplayPrompts = true

Показывать подробности о сбое, когда пользователь нажимает на выноску

Нажмите на значок, чтобы открыть карточку с подробной информацией. Это относится к выноскам как на маршруте, так и вне его, хотя выноски вне маршрута появляются только в том случае, если включен слой трафика. На карточке указан тип проблемы, время, когда о ней сообщили в последний раз, и иногда возможность проголосовать за то, сохраняется ли проблема. Тип карточки и ее настройки зависят от того, включена ли навигация.

Информационные карточки с уточнениями в обзорах маршрутов до начала навигации.

Перед началом навигации пользователи могут нажать на выноску на маршруте или за его пределами на карте или в обзоре маршрута, чтобы открыть информационную карточку. Чтобы видеть подсказки о съезде с маршрута, включите слой загруженности дорог. На карточке с информацией можно посмотреть подробности о сбое.

Карточка с общей информацией

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

mapView.settings.showsIncidentCards = true

Карточки с информацией во время навигации

Во время навигации пользователи могут нажать на выноску с информацией о проблеме на маршруте или за его пределами, чтобы открыть информационную карточку. На карточке указан тип проблемы и время, когда о ней сообщили в последний раз. Также на ней есть кнопки, с помощью которых пользователи могут проголосовать, актуальна ли ещё проблема.

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

Карточка с информацией об активной навигации

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

mapView.navigator.shouldDisplayPrompts = true

Автоматические оповещения о проблемах на дорогах с возможностью голосования во время навигации

Во время активной навигации, когда пользователь приближается к препятствию на маршруте, появляется подсказка с информацией о препятствии и кнопками для голосования о том, присутствует ли оно по-прежнему. Голоса пользователей обрабатываются Google и могут показываться на карте другим пользователям Google Карт и Navigation SDK, а также использоваться для определения того, следует ли продолжать показывать информацию о дорожном событии.

Карточка с информацией об активной навигации

Вы можете настроить показ предупреждений во время навигации с помощью shouldDisplayPrompts. Этот параметр также управляет показом выносок на маршрутах.

mapView.navigator.shouldDisplayPrompts = true

Сообщения о проблемах на дорогах во время навигации

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

Кнопка "Отчеты" Меню отчетов

Как показать или скрыть кнопку стандартных отчетов

Вы можете настроить видимость стандартной кнопки сообщения о проблеме во время активной навигации с помощью navigationReportIncidentButtonEnabled.

// Enables the incident reporting FAB to show in situations where incident
// reporting is possible.
mapView.settings.navigationReportIncidentButtonEnabled = true

Добавление кнопки специального отчета

Вместо стандартной кнопки для сообщения о проблемах на дороге вы можете добавить в интерфейс навигации собственную кнопку. Когда пользователь нажимает настраиваемую кнопку, вы можете вызвать меню "Сообщить о проблеме" с помощью метода presentReportIncidentsPanel. Прежде чем добавлять кнопку для специального отчета, убедитесь, что приложение находится в режиме активной навигации, а пользователь – в стране, где разрешена отправка сообщений. Для этого вызовите reportIncidentsAvailable. Если хотя бы одно из этих условий не выполняется, меню "Сообщить о проблеме" не появится.

  // Check if reporting is available before displaying your button
  let isReportingAvailable = mapview.isIncidentReportingAvailable()
  customReportingIncidentButton.isHidden = !isReportingAvailable
  customReportingIncidentButton.addTarget(self, action: #selector(didTapReportIncidentButton), for: .touchUpInside)
  
  // Trigger the reporting flow if the button is clicked
  func didTapReportIncidentButton() {
          mapView.presentReportIncidentsPanel(self) { [weak self] error in
              guard let self = self else { return }
              if let error = error as NSError? {
                  if error.domain == GMSMapViewPresentReportIncidentPanelErrorDomain {
                      let errorCode = GMSMapViewPresentReportIncidentPanelErrorCode(rawValue: error.code)
                      
                      switch errorCode {
                      case .internal:
                          self.showErrorMessage(
                              title: "Error Presenting Report Incident Panel",
                              message: "An internal error occurred."
                          )
                      case .reportingNotAvailable:
                          self.showErrorMessage(
                              title: "Error Presenting Report Incident Panel",
                              message: "Reporting is not available."
                          )
                      case .none:
                          self.showErrorMessage(
                              title: "Error Presenting Report Incident Panel",
                              message: "An unknown error occurred."
                          )
                      }
                  } else {
                      // Handle other potential errors (e.g., network errors)
                      self.showErrorMessage(
                          title: "Error Presenting Report Incident Panel",
                          message: "An unexpected error occurred: \(error.localizedDescription)"
                      )
                  }
              }
              // If error is nil, the panel was presented successfully. You can add any extra logic here.
          }
     }

Как работать с пользовательскими интерфейсами навигации

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

Расположение кнопки для отправки жалоб

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

Swift

// Create a new layout guide
let topRightLayoutGuide = UILayoutGuide()
self.view.addLayoutGuide(topRightLayoutGuide)

// Activate constraints using fixed constants here as an example
// assuming the current reporting button is of fixed height
topRightLayoutGuide.topAnchor.constraint(equalTo: _mapView.navigationHeaderLayoutGuide.bottomAnchor, constant: 50).isActive = true
topRightLayoutGuide.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor, constant: -14).isActive = true

// Assign the layout guide
_mapView.bottomTrailingButtonsLayoutGuide = topRightLayoutGuide

// Create an alternate layout guide to use when the header and the footer are not full width
let topRightAlternateLayoutGuide = UILayoutGuide()
self.view.addLayoutGuide(topRightAlternateLayoutGuide)

// Activate constraints using fixed constants here as an example
// assuming the current RTD button is of fixed height
topRightAlternateLayoutGuide.topAnchor.constraint(equalTo: _mapView.navigationHeaderLayoutGuide.bottomAnchor, constant: 20).isActive = true
topRightAlternateLayoutGuide.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor, constant: -10).isActive = true

// Assign the layout guide
_mapView.bottomTrailingButtonsAlternateLayoutGuide = topRightAlternateLayoutGuide

Objective-C

// Create a new layout guide
UILayoutGuide *topRightLayoutGuide = [[UILayoutGuide alloc] init];
[self.view addLayoutGuide:topRightLayoutGuide];

// Activate constraints using fixed constants here as an example
// assuming the current RTD button is of fixed height
[[topRightLayoutGuide.topAnchor
    constraintEqualToAnchor:_mapView.navigationHeaderLayoutGuide.bottomAnchor
                   constant:50]
    setActive:YES];

[[topRightLayoutGuide.trailingAnchor
    constraintEqualToAnchor:self.view.safeAreaLayoutGuide.trailingAnchor
                   constant:-14]
    setActive:YES];

// Assign the layout guide
_mapView.bottomTrailingButtonsLayoutGuide = topRightLayoutGuide;

// Create an alternate layout guide to use when the header and the footer are not full width
UILayoutGuide *topRightAlternateLayoutGuide = [[UILayoutGuide alloc] init];
[self.view addLayoutGuide:topRightAlternateLayoutGuide];

// Activate constraints using fixed constants here as an example
// assuming the current RTD button is of fixed height
[[topRightAlternateLayoutGuide.topAnchor
    constraintEqualToAnchor:_mapView.navigationHeaderLayoutGuide.bottomAnchor
                   constant:50]
    setActive:YES];

[[topRightAlternateLayoutGuide.trailingAnchor
    constraintEqualToAnchor:self.view.safeAreaLayoutGuide.trailingAnchor
                   constant:-14]
    setActive:YES];

// Assign the layout guide
_mapView.bottomTrailingButtonsAlternateLayoutGuide = topRightAlternateLayoutGuide;

Prompt Visibility API (экспериментальная функция)

Prompt Visibility API помогает избежать конфликтов между элементами интерфейса, созданными Navigation SDK, и вашими собственными элементами интерфейса. Для этого добавляется прослушиватель, который получает обратный вызов перед появлением элемента интерфейса Navigation SDK и сразу после его удаления. Вы можете получать обратные вызовы для элементов, связанных с дорожными происшествиями, в реальном времени, включая информационные карточки, подсказки и меню "Сообщить о проблеме", а также для других уведомлений, созданных Navigation SDK.

Swift

// Additional methods added to GMSNavigatorListener
...
func navigatorWillPresentPrompt(_ navigator: GMSNavigator) {
  // Hide any sort of custom UI element.
}

func navigatorDidDismissPrompt(_ navigator: GMSNavigator) {
  // Show any sort of custom UI element.
}
...

Objective-C

// Additional methods added to GMSNavigatorListener
...
- (void)navigatorWillPresentPrompt:(GMSNavigator *)navigator {
  // Hide any sort of custom UI element.
}

- (void)navigatorDidDismissPrompt:(GMSNavigator *)navigator {
  // Show any sort of custom UI element.
}
...