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