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

Вы можете управлять отображением предупреждений о нарушениях маршрута с помощью shouldDisplayPrompts
, который также управляет отображением автоматических оповещений, когда пользователь приближается к нарушению маршрута .
mapView.navigator.shouldDisplayPrompts = true
Отображение информации о сбоях при нажатии пользователем на выноску
Пользователи могут нажать на выноску, чтобы отобразить информационную карточку с дополнительной информацией о сбое, включая тип сбоя, время последнего сообщения о нём и, в некоторых случаях, возможность проголосовать за то, сохраняется ли сбой. Существует два типа информационных карточек, которые могут отображаться в зависимости от того, находится ли пользователь в режиме активной навигации, и параметры настройки различаются для каждого типа.
Вызов информационных карточек на обзорах маршрутов перед началом активной навигации
Когда пользователь нажимает на выноску на обзоре маршрута, перед началом активной навигации появляется информационная карточка с более подробной информацией о нарушении.

Вы можете контролировать возможность пользователей нажимать на уведомления о нарушениях на обзорах маршрутов для отображения дополнительной информации с помощью showsIncidentCards
.
mapView.settings.showsIncidentCards = true
Вызов информационных карточек во время активной навигации
Когда во время активной навигации на маршруте появляется уведомление о нарушении, пользователи могут нажать на него, чтобы отобразить информационную карточку с дополнительной информацией о нарушении, включая тип нарушения и время последнего сообщения о нём, а также кнопки для голосования по вопросу о том, сохраняется ли нарушение. Голоса пользователей обрабатываются Google и могут быть отображены на карте для других пользователей Google Карт и 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. } ...