Выберите платформу: 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.
}
...