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

Настройка сбоев в режиме реального времени

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

Функции реагирования на сбои в режиме реального времени

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

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

Интерактивные оповещения о сбоях в работе транспорта вдоль маршрутов

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

Вызовы вдоль маршрутов

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

mapView.navigator.shouldDisplayPrompts = true

Отображение подробной информации о сбое при нажатии пользователем на всплывающее окно.

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

Информационные карточки с описанием маршрута, которые отображаются перед началом активной навигации.

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

Обзорная информационная карточка

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

mapView.settings.showsIncidentCards = true

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

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

Информационная карточка активной навигации

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

mapView.navigator.shouldDisplayPrompts = true

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

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

Информационная карточка активной навигации

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

mapView.navigator.shouldDisplayPrompts = true

Сообщение о сбоях во время активной навигации

В режиме активной навигации на пользовательском интерфейсе появляется кнопка, позволяющая пользователям сообщать о новых препятствиях на своем маршруте. При нажатии на кнопку появляется меню с доступными типами препятствий для сообщения. Сообщения, отправленные пользователями, обрабатываются Google и могут отображаться на карте для других пользователей Google Maps и 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 .

Быстрый

// 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;

API для отображения подсказок (экспериментальная версия)

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

Быстрый

// 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.
}
...