Cómo configurar interrupciones en tiempo real
Las interrupciones en tiempo real son un conjunto de funciones que alertan a los usuarios sobre las interrupciones en su ruta y les permiten informar y verificar las interrupciones que encuentran. Algunos ejemplos de interrupciones incluyen accidentes automovilísticos, congestión de tráfico, presencia de la policía y radares de velocidad, construcciones, cierres de carriles y ciertas condiciones climáticas. En esta página, se explican las funciones de interrupciones en tiempo real y sus opciones de configuración, incluidas las consideraciones para las apps que usan IU de navegación personalizadas.
Funciones de interrupción en tiempo real
El SDK de Navigation incluye las siguientes funciones de interrupciones en tiempo real como parte de la experiencia de navegación principal:- Avisos interactivos de interrupciones a lo largo de las rutas.
- Alertas automáticas de interrupciones con votación durante la navegación activa.
- Informes de interrupciones durante la navegación activa.
Estas funciones son configurables y están habilitadas de forma predeterminada. En las siguientes secciones, se proporciona más información sobre las funciones y las opciones de configuración disponibles.
Avisos interactivos de interrupciones a lo largo de las rutas
Cuando una app muestra una ruta, ya sea en un resumen de la ruta o durante la navegación activa, las interrupciones actuales aparecen como llamadas a lo largo de la ruta. Los textos destacados incluyen un ícono que indica el tipo de interrupción.

Puedes controlar la visualización de los textos destacados de interrupciones a lo largo de las rutas con shouldDisplayPrompts
, que también controla la visualización de alertas automatizadas cuando un usuario se acerca a una interrupción.
mapView.navigator.shouldDisplayPrompts = true
Mostrar detalles de la interrupción cuando un usuario presiona una llamada
Los usuarios pueden presionar una llamada para mostrar una tarjeta de información con más detalles sobre la interrupción, como el tipo, la hora en que se reportó por última vez y, en algunos casos, una opción para votar si la interrupción aún está presente. Existen dos tipos diferentes de tarjetas de información que pueden aparecer, según si el usuario está en navegación activa, y las opciones de configuración varían para cada tipo.
Tarjetas de información de llamadas en las vistas generales de la ruta, antes de iniciar la navegación activa
Cuando un usuario presiona una llamada en un resumen de la ruta antes de iniciar la navegación activa, aparece una tarjeta de información con más detalles sobre la interrupción.

Puedes controlar la capacidad de los usuarios para presionar los mensajes de interrupción en los resúmenes de rutas y mostrar más información con showsIncidentCards
.
mapView.settings.showsIncidentCards = true
Tarjetas de información de texto destacado durante la navegación activa
Cuando aparece un texto destacado de interrupción a lo largo de una ruta durante la navegación activa, los usuarios pueden presionarlo para mostrar una tarjeta de información con más detalles sobre la interrupción, incluido el tipo y la hora en que se informó por última vez, así como botones para votar si la interrupción sigue presente. Google procesa los votos que envían los usuarios y es posible que se muestren en el mapa para otros usuarios de Google Maps y del SDK de Navigation, además de usarse para determinar si se debe seguir mostrando la interrupción.

Puedes controlar la visualización y la capacidad de tocar las leyendas de interrupciones durante la navegación activa con shouldDisplayPrompts
, que también controla la visualización de leyendas a lo largo de las rutas y la visualización de alertas automatizadas cuando un usuario se acerca a una interrupción.
mapView.navigator.shouldDisplayPrompts = true
Alertas de interrupciones automatizadas con votación durante la navegación activa
Durante la navegación activa, cuando un usuario se acerca a una interrupción en una ruta, aparece un mensaje con información sobre la interrupción y botones para votar si la interrupción sigue presente. Google procesa los votos que envían los usuarios y es posible que se muestren en el mapa para otros usuarios de Google Maps y del SDK de Navigation, además de que se usan para determinar si se debe seguir mostrando la interrupción.

Puedes configurar la visualización de mensajes de alerta durante la navegación activa con shouldDisplayPrompts
, que también controla la visualización de llamadas a lo largo de las rutas.
mapView.navigator.shouldDisplayPrompts = true
Informes de interrupciones durante la navegación activa
Durante el modo de navegación activa, aparece un botón en la IU de navegación que permite a los usuarios informar sobre nuevas interrupciones en su ruta. Cuando un usuario presiona el botón, aparece un menú con los tipos de interrupciones disponibles para informar. Google procesa los informes que envían los usuarios y es posible que se muestren en el mapa para otros usuarios de Google Maps y del SDK de Navigation.


Cómo mostrar u ocultar el botón de informes estándar
Puedes configurar la visibilidad del botón de informes estándar durante la navegación activa con navigationReportIncidentButtonEnabled
.
// Enables the incident reporting FAB to show in situations where incident // reporting is possible. mapView.settings.navigationReportIncidentButtonEnabled = true
Agrega un botón de informes personalizados
En lugar del botón estándar para informar interrupciones, puedes agregar un botón personalizado a la IU de navegación. Cuando el usuario hace clic en el botón personalizado, puedes activar la visualización del menú de informes llamando al método presentReportIncidentsPanel
. Antes de agregar un botón de informes personalizado, llama a reportIncidentsAvailable
para verificar que la app esté en navegación activa y que el usuario se encuentre en un país en el que los informes estén habilitados. Si no se cumple alguna de estas condiciones, no aparecerá el menú de informes.
// 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. } }
Trabaja con IU de navegación personalizadas
Si tu implementación del SDK de Navigation incluye elementos de IU personalizados, debes tener en cuenta los elementos de interrupción en tiempo real para evitar conflictos.
Posicionamiento del botón de denuncia
De forma predeterminada, el botón para informar interrupciones se ubica en el extremo inferior o en la esquina final del mapa, a la derecha para los idiomas que se leen de izquierda a derecha y a la izquierda para los idiomas que se leen de derecha a izquierda. Si necesitas mover el botón de informes para dejar espacio para los elementos de la IU personalizados, usa unbottomTrailingButtonsLayoutGuide
.
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;
API de Prompt Visibility (experimental)
La API de Prompt Visibility te ayuda a evitar conflictos entre los elementos de la IU generados por el SDK de Navigation y tus propios elementos de la IU personalizados. Para ello, agrega un objeto de escucha para recibir una devolución de llamada antes de que aparezca un elemento de la IU del SDK de Navigation y en cuanto se quite el elemento. Puedes recibir devoluciones de llamada para los elementos de interrupción en tiempo real, incluidas las tarjetas de información, los mensajes y el menú de informes de interrupciones, así como para otras notificaciones que genera el SDK de Navigation.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. } ...