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