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